当前位置: 首页 > article >正文

C++类和对象入门(二)

顾得泉:个人主页

个人专栏:《Linux操作系统》 《C++从入门到精通》  《LeedCode刷题》

键盘敲烂,年薪百万!


一、类的作用域

       类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。

class Person
{
public:
     void PrintPersonInfo();
private:
     char _name[20];
     char _gender[3];
     int  _age;
};

        这里需要指定PrintPersonInfo是属于Person这个类域

void Person::PrintPersonInfo()
{
     cout << _name << " "<< _gender << " " << _age << endl;
}

二、类的实例化

用类类型创建对象的过程,称为类的实例化

     1. 类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它;比如:入学时填写的学生信息表,表格就可以看成是一个类,来描述具体学生信息。

       类就像谜语一样,对谜底来进行描述,谜底就是谜语的一个实例。

       谜语:“年纪不大,胡子一把,主人来了,就喊妈妈” 谜底:山羊

     2. 一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量

int main()
{
     Person._age = 100;   // 编译失败:error C2059: 语法错误:“.”
     return 0;
}

       people类是没有空间的,只有Person类实例化出的对象才有具体的年龄。

     3. 做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。


三、类对象模型

1.如何计算类对象的大小

问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小?为什么类的大小不计算成员函数的大小呢?

以下述类为例:

class A
{
public:
    void PrintA()
    {
       cout<<_a<<endl;
    }
private:
    char _a;
};

2.类对象的存储方式猜测

①  对象中包含类的各个成员

缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。那么如何解决呢?

②  代码只保存一份,在对象中保存存放代码的地址

③   只保存成员变量,成员函数存放在公共的代码段

问题:对于上述三种存储方式,那计算机到底是按照那种方式来存储的?

我们再通过对下面的不同对象分别获取大小来分析看下

     ①  类中既有成员变量,又有成员函数

class A1 
{
public:
    void f1() {}
private:
    int _a;
};

     ②  类中仅有成员函数 

class A2 
{
public:
   void f2() {}
};

     ③  类中什么都没有---空类

class A3
{};

验证结果:

结论:很明显猜测三是正确的

       一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐。

       注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

3. 结构体内存对齐规则

     ①第一个成员在与结构体偏移量为0的地址处。

     ②其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

注意:对齐数 = 编译器默认的一个对齐数与该成员大小的较小值。VS中默认的对齐数为8

     ③结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。

     ④如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

4.小提问 (面试题)

①结构体怎么对齐?为什么要进行内存对齐?

②如何让结构体按照指定的对齐参数进行对齐?能否按照3、4、5即任意字节对齐?

③什么是大小端?如何测试某台机器是大端还是小端,有没有遇到过要考虑大小端的场景?

       答案大家自己进行思考动手查阅哦!!!


结语:关于C++类和对象二次分享到这里就结束了,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言,最后祝大家新的一年里学业有成,天天开心~~~ 


http://www.kler.cn/a/226384.html

相关文章:

  • DockerCompose+SpringBoot+Nginx+Mysql实践
  • 正点原子--STM32定时器学习笔记(1)(更新中....)
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TimePicker组件
  • 【Spark系列6】如何做SQL查询优化和执行计划分析
  • 三步实现 Sentinel-Nacos 持久化
  • Redis常用数据类型--Hash
  • C#学习笔记_继承
  • vue-3d-model
  • 极限存在法则【高数笔记】
  • 八. 实战:CUDA-BEVFusion部署分析-学习spconv的优化方案(Implicit GEMM conv)
  • C++:输入流/输出流
  • SpringBoot security 安全认证(三)——自定义注解实现接口放行配置
  • MyBatis常见面试题汇总
  • 云原生 API 网关链路追踪能力重磅上线
  • 用户体验优化:HubSpot的秘密武器
  • 深度解读NVMe计算存储协议-3
  • Xlua分析:C#调用Lua
  • 在 Elastic Agent 中为 Logstash 输出配置 SSL/TLS
  • 作业帮面试题汇总
  • 【脑电信号处理与特征提取】P5-彭薇薇:脑电信号的预处理及数据分析要点