成员函数的储存方式

每个对象所占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括函数代码所占用的存储空间。

类中成员函数的存储方式 - 图1

为了区分是哪个对象在调用公共函数,在 c++ 中专门设立了一个this指针,用来指向不同的对象。

this 指针

  1. class Car {
  2. public:
  3. int m_price;
  4. void SetPrice(int p) {
  5. m_price = p;
  6. }
  7. };
  8. int main() {
  9. Car car;
  10. car.SetPrice(20000);
  11. return 0;
  12. }

上面是 C++ 代码,翻译成如下的 C 代码

  1. struct Car {
  2. int price;
  3. };
  4. void SetPrice(struct Car* this, int p) {
  5. this->price = p;
  6. }
  7. int main() {
  8. struct Car car;
  9. SetPrice(&car, 20000); // 给car结构体的price变量赋值
  10. return 0;
  11. }

非静态成员函数中可以直接使用 this 来代表指向该函数作用的对象的指针。静态成员函数是不能使用 this 指针,因为静态成员函数相当于是共享的变量,不属于某个对象的变量。

类大小的计算

首先,类大小的计算遵循结构体的对齐原则 ,类的大小与普通数据成员有关,与成员函数和静态成员无关。即普通成员函数,静态成员函数,静态数据成员,静态常量数据成员均对类的大小无影响。

空类的大小是一个特殊情况,空类的大小为1个字节。静态数据成员之所以不计算在类的对象大小内,是因为类的静态数据成员被该类所有的对象所共享,并不属于具体哪个对象,静态数据成员定义在内存的全局区。

// TODO 虚函数,虚继承,多继承