3.2:Data Member的布局 && 3.3:Data member的存取

本文探讨了C++中类的内存布局,包括静态成员和非静态成员的存放位置。静态成员在数据段中只有一个实体,而非静态成员则存在于每个类对象中。通过指针和对象访问成员变量时,静态成员访问方式相同,而非静态成员通过隐含的对象(this指针)进行操作。文章还举例展示了成员函数如何直接操作非静态成员。
摘要由CSDN通过智能技术生成

考虑如下代码:

class Point3d {
private:
    float x;
    static List<Point3d*> *freeList;
    float y;
    static const int chunkSize = 250;
    float z;
};

Nonstatic data memberclass object中排列顺序將和被声明的顺序一样,任何中间介入的static data member都不会放进对象布局之中;static data members存放在data segment


考虑如下代码:

Point3d origin, *pt = *origin;
origin.x = 0.0;
pt->x = 0.0;
static date Members

每一个static data member只有一个实体,存在在程序的data segment之中,每次程序调用static member,就会被内部转化为对该唯一的extern实体直接操作,例如:

// origin.chunkSize = 250;
Point3d::chunkSize = 250;

// pt->chunkSize = 250;
Point3d::chunkSize = 250;

从指令执行观点来看,这是C++语言中"通过一个指针和通过一个对象来获取member",结论完全相同的唯一一种情况;

nonstatic data members

nonstatic data members直接存放在每一个class object之中,只要程序员在一个member function中直接处理一个nonstatic data member,所谓implicit class object就会发生

Point3d Point3d::transalte(const Point3d &pt) {
	x += pt.x;
	y += pt.y;
	z += pt.z;
}

表面上看到对于x,y,z的直接存取,事实上是经由一个implicit class object(this指针)完成的

Point3d Point3d::transalte(Point3d *const int,const Point3d &pt) {
	x += pt.x;
	y += pt.y;
	z += pt.z;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值