3.3 Data member存取
1.静态成员的存取
static member可视为一个global变量,但是只在class生命周期内可见。static member只有一个实例放置在data segment。因此每次取用static member时,在内部会被转换为对唯一的extern实例的操作。取一个static member的地址,会得到指向该数据类型的指针,而不是指向class member的指针。
2.非静态数据成员的存取
非静态成员都是直接存放在每一个class object中,所以只有经过class object(或者*this)才能进行存取。对一个非静态成员变量的存取操作,编译器需要把class object的地址加上data member的偏移量(offset)
&origin._y = 0.0;
//地址&origin._y将等于
&origin + (&Point::_y - 1)
3. 通过对象访问类成员元素与通过指针访问类成员的效率
Point3d origin;
Pointed *pt=&origin;
首先定义一个Point3d 对象origin和一个 Pointe3d的指针
origin.x=0.0;
pt->x=0.0;
这两种的存取方式的区别:
当pointe3d是一个派生类,且继承结构中有虚基类,并且x是虚基类的数据成员时候,就会有较大的差异。这个时候不能说pt必然指向哪一种classtype,也就是说不知道x这个成员在编译期真正的offset位置,所以这个存取操作必须延迟至执行期,经过一个额外的间接导引,才能解决。但是如果使用origin,就不会有这种问题,因为origin肯定是Pointe3d这个类的,即使他是继承虚基类,成员的偏移位置在编译期就固定了。