3.3 Data Memeber的存取

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这个类的,即使他是继承虚基类,成员的偏移位置在编译期就固定了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值