一,Nonstatic Data Members
nonstatic data members直接存储在每一个class object中,除非经由显示的或隐式的class object,否则没有办法直接存取他们。只要程序员在一个member function中直接处理一个nonstatic data member,所谓的隐式的class object就会发生。
class Point{
private:
double x;
double y;
public:
double getX(){
return x;
}
};
上面定义一个Point类,getX成员函数对于x的获取是通过一个implicit class object(this指针)完成的,事实上这个成员函数的参数是
double getX(Point *const this){
return this->x;
}
二,Static Data Members
每一个static data member只有一个实例,静态成员的存储位置独立于每个对象,即放在对象之外。每次程序取用static member时,就会被内部转化为对该唯一extern实例的直接操作。
class Point{
private:
double x;
double y;
static double z;
};
例如:
Point obj;
Point *pObj = &obj;
obj.z = 20;
//Point::z = 20;
pObj->z = 30;
//Point::z = 30;
三,"继承"与Data Member(只要继承不要多态)
在C++继承模型中,一个derived class object所表现出来的东西,是其自己的members加上其base class members的总和,base class subobject在derived class中会保持原样性。下面是一个类的继承结构
class Point1{
private:
int val;
char bit1;
};
class Point2 : public Point1{
private:
char bit2;
};
class Point3 : public Point2{
private:
char bit3;
};
Point1、Point2、Point3的对象布局
四,加上多态
在一个类中声明一个虚函数,带来的空间和存储时间上的开销
1,编译器会创建一个与class相关的virtual table,在这个虚函数表中存储每个virtual function的地址。
2,在每一个class object中创建一个隐式的vptr指针,使每一个对象找到对应的virtual table。
3,加强constructor,使他能为vptr设定初值,让它指向class对应的virtual table。
4,加强destructor,使他能抹消"指向class之相关virtual table"的vptr。
五,一个class object的大小会受几个因素的影响
1,类中定义的nonstatic data member都直接存储在对象中。
2,由编译器自动加上的额外的data members,用于支撑语言特性(主要是各种virtual特性)。
3,因为内存对齐的需要。