对象布局(不通过友元访问私有成员)
在一个特定的的“访问块”(被访问说明符限定的一组声明),变量在内存中肯定是连续存放的;然而“访问块”本身可以不按声明的顺序在对象中出现。
访问说明符是结构的一部分,它们并不影响从这个结构创建的对象。程序开始运行之前,所有的访问说明信息都消失了。访问说明信息通常是在编译期间消失的。在程序运行期间,对象变成了一个存储区域,没带任何访问限定信息,因此,如果有人真想破坏这些规则并且直接访问内存中的数据,那么C++并不能阻止他做这样的事。
下面是在类外部修改类的私有成员的一个测试:
#include<iostream> using namespace std; class A { public: int i; private: int j; public: A(){i=1;j=2;} int return_i() {return i;} int return_j() {return j;} }; int main() { A a; cout<<"sizeof(A):"<<sizeof(A)<<endl; cout<<"before modify"<<endl; cout<<"i="<<a.return_i()<<endl; cout<<"j="<<a.return_j()<<endl; int *ptr_i=(int*)&a; *ptr_i=3; *(ptr_i+1)=4; cout<<"after modify"<<endl; cout<<"i="<<a.return_i()<<endl; cout<<"j="<<a.return_j()<<endl; return 0; }
运行结果: