C++ 面向对象的一大特性就是封装,使用不同的访问控制符来控制外接对其的访问权限。比如:
class A
{
public:
A(): i(){}
void print(){ cout << "A::i = " << i << endl; } private:
int i;
};
这里的A 类对象的 i 对外接来说就是透明的。通过private 来隐藏对象的某些属性。但是,C++也继承了大部分C的特性,比如说很好很强大的指针。利用指针,我们可以绕过编译器做一些 见不得光的事情。虽然不建议这么做,因为这样不仅破坏了数据的封装特性,也会带来很多危险。不过这里我还是这么做了。。。。。
请看下面的这个例子,利用指针p去修改 对象a 的私有成员i 的值:
/*========================================================*\
* 利用指针突破C++编译器的防线
*
* 樊列龙 2013/6/22
*
\*========================================================*/ #include <iostream>
using namespace std; class A
{
public:
A(): i(){}
void print(){ cout << "A::i = " << i << endl; } private:
const int i;
}; int main()
{
A a; int* p = (int*)&a; // 突破编译器的防线
a.print(); *p = ; // 偷偷修改a 对象私有成员的值
a.print(); return ;
}
执行结果:
A::i =
A::i =
通过打印结果可以看出p 真的做了不该做的事情
这时候有的朋友可能会觉得将A 类中的 i 声明成 const int 指针p应该就无能为力了吧。
事实证明 私有成员变量及时是 const 类型也是无济于事的,他们都无法阻挡指针的穿透力!!!
纯属娱乐,写代码的时候千万不要真的这么写!