成员函数的储存方式
每个对象所占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括函数代码所占用的存储空间。
为了区分是哪个对象在调用公共函数,在 c++ 中专门设立了一个this指针,用来指向不同的对象。
this 指针
class Car {
public:
int m_price;
void SetPrice(int p) {
m_price = p;
}
};
int main() {
Car car;
car.SetPrice(20000);
return 0;
}
上面是 C++ 代码,翻译成如下的 C 代码
struct Car {
int price;
};
void SetPrice(struct Car* this, int p) {
this->price = p;
}
int main() {
struct Car car;
SetPrice(&car, 20000); // 给car结构体的price变量赋值
return 0;
}
非静态成员函数中可以直接使用 this 来代表指向该函数作用的对象的指针。静态成员函数是不能使用 this 指针,因为静态成员函数相当于是共享的变量,不属于某个对象的变量。
类大小的计算
首先,类大小的计算遵循结构体的对齐原则 ,类的大小与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数,静态成员函数,静态数据成员,静态常量数据成员均对类的大小无影响。
空类的大小是一个特殊情况,空类的大小为1个字节。静态数据成员之所以不计算在类的对象大小内,是因为类的静态数据成员被该类所有的对象所共享,并不属于具体哪个对象,静态数据成员定义在内存的全局区。
// TODO 虚函数,虚继承,多继承