类的成员函数和数据成员分别存在哪里,类大小的计算

VersionSDescriptionDateBy
V1CFirst Version2020-12-27AYZP

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

  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Computer类的数据成员可以包括: 1. 品牌(brand):表示电脑的品牌,可以是字符串类型。 2. 型号(model):表示电脑的型号,可以是字符串类型。 3. CPU(cpu):表示电脑的CPU型号,可以是字符串类型。 4. 内(memory):表示电脑的内大小,可以是整型或浮点型。 5. 硬盘(hardDisk):表示电脑的硬盘大小,可以是整型或浮点型。 6. 显卡(graphicsCard):表示电脑的显卡型号,可以是字符串类型。 7. 屏幕尺寸(screenSize):表示电脑的屏幕尺寸,可以是整型或浮点型。 8. 价格(price):表示电脑的价格,可以是整型或浮点型。 Computer类的成员函数可以包括: 1. 构造函数(__init__):用于初始化对象的数据成员。 2. 显示电脑信息(display):用于显示电脑的品牌、型号、CPU、内、硬盘、显卡、屏幕尺寸和价格等信息。 3. 计算折扣价(calculateDiscountPrice):用于计算电脑的折扣价,可以根据不同的折扣策略进行计算。 4. 设置品牌(setBrand):用于设置电脑的品牌。 5. 设置型号(setModel):用于设置电脑的型号。 6. 设置CPU(setCPU):用于设置电脑的CPU型号。 7. 设置内(setMemory):用于设置电脑的内大小。 8. 设置硬盘(setHardDisk):用于设置电脑的硬盘大小。 9. 设置显卡(setGraphicsCard):用于设置电脑的显卡型号。 10. 设置屏幕尺寸(setScreenSize):用于设置电脑的屏幕尺寸。 11. 设置价格(setPrice):用于设置电脑的价格。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值