天天看点

从内存的角度理解c++类的属性和方法

C++语言内存四区的概念:栈区,堆区,全局区,代码区。

定义一个空类。

Void myClass

{

Private:

Protected:

Public:

};

Void main()

{

Printf(“%d”,sizeof(myClass ));

}

发现一个空类占用一个字节,这一个字节叫作"占位符",那1个字节是用来占一个空间,获取这个地址的,地址才是唯一标识符。

定义两个类A1,A2,分别求A1和A2占多少个字节。

class C1

{

public:

int i;

int j;

int k;

protected:

private:

};

class C2

{

public:

int i;

int j;

int k;

static int m;

public:

int getK() const { return k; }

void setK(int val) { k = val; }

protected:

private:

};

void main()

{

    printf("c1:%d \n", sizeof(C1));

printf("c2:%d \n", sizeof(C2));

}

结果发现C1和C2同样都是12个字节。

解释原因:

1)C++类对象中的成员变量和成员函数是分开存储的

成员变量:

普通成员变量:存储于对象中,与struct变量有相同的内存布局和字节对齐方式

静态成员变量:存储于全局数据区中,静态成员不可在类体内进行赋值,也不能在类的构造函数中初始化该成员,因为它是被所有该类的对象所共享的。它在对象中不占用存储空间,你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值。

静态成员可以被初始化,但只能在类体外进行初始化。

成员函数:存储于代码区中。

因此C1和C2计算的内存空间都是普通成员变量所占用的空间(堆区),但是并不代表C1就和C2完全一样,他们本质不一样。

继续阅读