Version | S | Description | Date | By |
---|---|---|---|---|
V1 | C | First Version | 2020-12-27 | AYZP |
C―― Create,> A—— Add,> M—— Modify,> D—— Delete。
前言
这个问题时不时蹦出来,记录一下
类的成员函数存放在代码区,数据成员分为静态变量和非静态变量,静态变量在类定义的时候,就分配好了,存放在数据区,然后非静态变量时在构造对象的时候,存放在堆栈中。
类的大小实际上只是数据部分的大小(包括虚函数指针),成员函数不占用类的大小。
正文
三个类:
A 什么都没有的空类
B 有成员函数
C 带有虚函数
那它们内存大小:
A=1 B=1 C=4
- 成员函数是不占类空间的(静态数据成员和静态成员函数是类的一部分,而不是对象的一部分)
- 不论成员函数在类内定义还是在类外定义,成员函数的代码段都用同一种方式存储。
- 类为什么只能直接调用静态类成员函数,而非静态类成员函数(即使函数没有参数)只有类对象才能调用呢?原因是类的非静态类成员函数其实都内含了一个指向类对象的指针型参数(即this指针),因而只有类对象才能调用(此时this指针有实值)。
- 类中包括成员变量和成员函数。new出来的只是成员变量,成员函数始终存在,所以如果成员函数未使用任何成员变量的话,不管是不是static的,都能正常工作。需要注意的是,虽然调用不同对象的成员函数时都是执行同一段函数代码,但是执行结果一般是不相同的。不同的对象使用的是同一个函数代码段,它怎么能够分别对不同对象中的数据进行操作呢?原来C++为此专门设立了一个名为this的指针,用来指向不同的对象。
本质:
每个对象所占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括函数代码所占用的存储空间。
- 所有类成员函数和非成员函数代码放在代码区
- 类的静态成员变量在类定义时就已经在全局数据区分配了内存,因而它是属于类的
- 非静态成员变量,我们是在类的实例化过程中(构造对象)才在栈区或者堆区为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象的
参考文献
[1] zhishihudiebuyuanyi. c++类的成员函数、数据成员存储方式(是否属于类的对象). CSDN. 2017.10.
https://blog.csdn.net/zhishihudiebuyuanyi/article/details/78299814
[2] fuzhongmin05. C++成员函数在内存中的存储方式. CSDN. 2017. 03.
https://blog.csdn.net/fuzhongmin05/article/details/59112081