考虑如下代码:
class Point3d {
private:
float x;
static List<Point3d*> *freeList;
float y;
static const int chunkSize = 250;
float z;
};
Nonstatic data member
在class 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;
}