🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 简介 类是创建对象的模板,不占用内存空间,不存在于编译后的可执行文件中;而对象是实实在在的数据,需要内存来存储。对象被创建时会在栈区或者堆区分配内存。 直观的认识是,如果创建了 10 个对象,就要分别为这 10 个对象的成员变量和成员函数分配内存,如下图所示: ![](https://img.kancloud.cn/0d/36/0d362721c1eeb8b2bbcbc17905341fa2_398x181.png) 不同对象的成员变量的值可能不同,需要单独分配内存来存储。但是不同对象的成员函数的代码是一样的,上面的内存模型保存了 10 份相同的代码片段,浪费了不少空间,可以将这些代码片段压缩成一份。 事实上编译器也是这样做的,编译器会将成员变量和成员函数分开存储:分别为每个对象的成员变量分配内存,但是所有对象都共享同一段函数代码。如下图所示: ![](https://img.kancloud.cn/71/6f/716ff2536bf814127895e9a4afc15b3e_372x122.png) 成员变量在堆区或栈区分配内存,成员函数在代码区分配内存 # 成员变量和函数的存储 1. 空类的大小是1,sizeof 2. 类成员函数和静态成员变量,静态成员函数不占用类的大小 3. 普通成员变量占用类大小 4. 类的成员中,成员变量和成员函数是分开存储的 在c语言中,“分开来声明的,也就是说,语言本身并没有支持“数据”和“函数”之间的关联性我们把这种程序方法称为“程序性的”,由一组“分布在各个以功能为导航的函数中”的算法驱动,它们处理的是共同的外部数据。 c++实现了“封装”,那么数据(成员属性)和操作(成员函数)是什么样的呢? “数据”和“处理数据的操作(函数)”是分开存储的 * c++中的非静态数据成员直接内含在类对象中,就像c struct一样。 * 成员函数(member function)虽然内含在class声明之内,却不出现在对象中。 * 每一个非内联成员函数(non-inline member function)只会诞生一份函数实例. ~~~ class MyClass01{ public: int mA; }; class MyClass02{ public: int mA; static int sB; }; class MyClass03{ public: void printMyClass(){ cout << "hello world!" << endl; } public: int mA; static int sB; }; class MyClass04{ public: void printMyClass(){ cout << "hello world!" << endl; } static void ShowMyClass(){ cout << "hello world!" << endl; } public: int mA; static int sB; }; int main(){ MyClass01 mclass01; MyClass02 mclass02; MyClass03 mclass03; MyClass04 mclass04; cout << "MyClass01:" << sizeof(mclass01) << endl; //4 //静态数据成员并不保存在类对象中 cout << "MyClass02:" << sizeof(mclass02) << endl; //4 //非静态成员函数不保存在类对象中 cout << "MyClass03:" << sizeof(mclass03) << endl; //4 //静态成员函数也不保存在类对象中 cout << "MyClass04:" << sizeof(mclass04) << endl; //4 return EXIT_SUCCESS; } ~~~