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

C++类和对象上

1. 面向对象编程与面向过程编程的比较

我们一开始接触的C语言就是一门面向过程编程的语言,而C++就是一门面向对象编程的语言。那么这两者有什么区别呢?

举个例子,就比如说点外卖,如果是C语言的话,那么在程序的编写过程中更加注意于用户点外卖,商家接外卖,骑手送外卖。通过实现这几个过程来实现整个流程。但是如果说是C++的话,那么我们就会更加的看中用户,商家,骑手这三个类,即通过完善类来实现类与类之间的交互从而来实现整个流程。

2. 类的定义

class vector
{
public:........
private:.........
};​

这就是一个类的定义。当然,我们也可以把这个class换成struct。

我们不止可以在里面写上成员变量,我们更可以在里面写上函数(叫做成员函数),一般来说我们会把函数头和函数实现写在一起,因为更方便。

PS:C++里面更喜欢写成class。

class student
{
public:void getInformation(){cout<<_name<<endl;cout<<_age<<endl;cout<<_class<<endl;}private:int _age;string _name;string _class;
}

PS:感觉上面那个例子不够明显,就在举了一个。

3. 类的访问限定符及封装

3.1 访问限定符

如图所示,访问限定符包含了这三类,分别为public,protect和private。

1. public修饰的成员在类外可以直接被访问

2. protectedprivate修饰的成员在类外不能直接被访问(此处protectedprivate是类似的)

3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止

4. 如果后面没有访问限定符,作用域就到 } 即类结束。

5. class的默认访问权限为privatestructpublic(因为struct要兼容C)

PS:class和struct的区别是struct定义的类默认访问权限是publicclass定义的类默认访问权限是private

3.2 封装

封装,继承多态是C++语法上的三大特性,我们在这里就来介绍一下封装。

什么叫封装呢?封装本质上是一种管理,让用户更方便使用类。比如:对于电脑这样一个复杂的设备,提供给用户的就只有开关机键、通过键盘输入,显示器,USB插孔等,让用户和计算机进行交互,完成日常事务。但实际上电脑真正工作的却是CPU、显卡、内存等一些硬件元件。

class student
{
public:void getInformation(){cout<<_name<<endl;cout<<_age<<endl;cout<<_class<<endl;}private:int _age;string _name;string _class;
}

比如说在这个代码中,一个学生的年龄,名字和班级,我并不希望查询的人可以随意的访问并修改。所以我在这里把他设置为private,我只希望别人可以查看信息,所以我写了一个函数来允许别人通过这个函数来进行查看。

4. 类的作用域

一个类定义了一个新的作用域 ,类的所有成员都在类的作用域中 在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。
class student
{
public:void getInformation()   private:int _age;string _name;string _class;
}
void student::getInformation()
{cout<<_name<<endl;cout<<_age<<endl;cout<<_class<<endl;
}

我们看,在这里就是通过在getInformation前面加上一个student::来表示这个函数是属于这个student类。

5. 类的实例化

用类创建对象的过程,称为类的实例化。
因为类实际上我们可以理解为图纸,在没有把类实例化前是无法使用这个类的。
一个类可以实例化出多个对象, 实例化出的对象 占用实际的物理空间,存储类成员变量。
class student
{
public:void getInformation(){cout<<_name<<endl;cout<<_age<<endl;cout<<_class<<endl;}private:int _age;string _name;string _class;
}

比如说在这个代码里面,student是无法直接使用的,要把它实例化成一个个学生的信息我们才可以通过getInformation()进行调用。

PS:一个类可以实例化多份对象。

5.1 类实例化后大小的计算

一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐。
注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。

我们在这里要引入一个概念,叫做结构体内存对齐规则

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

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

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

VS中默认的对齐数为8

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

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整

体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

PS:之所以计算机没有直接堆着放是为了提高编译速度。想想看对齐了的话编译器就只要那几个位置就好,通过这种方式可以大大的提高编译速度。

6. this指针

6.1 什么是this指针

class student
{
public:void student(string name,int age,string class){    _name=name;_age=age;_class=class}void getInformation(){cout<<_name<<endl;cout<<_age<<endl;cout<<_class<<endl;}private:int _age;string _name;string _class;
}int main()
{student s1("小明",18,"一班");student s2("小红",19,"二班");s1.getInformation();s2.getInformation();return 0;
}

我们来看这个代码,相信很多人都可以看懂这份代码。那么我们有没有想过,在这份代码里面为什么 getInformation()可以识别s1和s2并对它们做出区分呢。

这里我们就要增加一个概念叫做this指针,这是一个并不用我们去写就会自己存在的一个指针,并且它的指向已经固定了。举个例子,我们在void student(string name,int age,string class)这个函数里面_name=name实际上是this._name=name,age和class也是同样的道理。所以,当我们调用s1的getInformation()的时候,编译器会自动访问s1里面的那个this指针。通过这样的方式来实现s1和s2的区分。

6.2 this指针的特性

1. this 指针的类型:类型 * const ,即成员函数中, 不能给this指针赋值
2. 只能在 成员函数 的内部使用
3. this 指针本质上是 成员函数 的形参 ,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以 对象中不存储 this 指针
4. this 指针是 成员函数 第一个隐含的指针形参,一般情况由编译器通过 ecx 寄存器自动传
递,不需要用户调用

6.3 this指针本身的位置

this指针本身的存储位置并非固定的,如果说一个类的参数比较少的话那么系统或者说编译器就会把this指针存放在寄存器上,如果说类的参数比较多的话,那么会被放在栈上。

那么为什么shis要先寄存器在栈呢,这是因为寄存器传递速度快。

PS:99%的情况下this本身是存在栈上的。

相关文章:

  • 什么是单元测试的“覆盖率”
  • 《软件设计师》复习笔记(11.4)——处理流程设计、系统设计、人机界面设计
  • mysql collation_database 参数
  • Linux内核机制——内存管理
  • Git LFS 学习笔记:原理、配置、实践与心路历程
  • 【ROS】TEB 规划器
  • 概率多假设跟踪(PMHT):多目标跟踪中的概率软关联与高效跟踪算法解析
  • 继承的了解与学习
  • 使用 vcpkg 构建支持 HTTPS 的 libcurl 并解决常见链接错误
  • 【时时三省】(C语言基础)用do...while语句实现循环
  • Wireshark 搜索组合速查表
  • linux服务器命令行获取nvidia显卡SN的方法
  • 通过 winsw 把相关服务配置windows自启动
  • package.json 里面出现 workspace:*,关于工作区的解释
  • 文献总结:NIPS2023——车路协同自动驾驶感知中的时间对齐(FFNet)
  • 时序逻辑电路——序列检测器
  • 如何提高单元测试的覆盖率
  • PC主板及CPU ID 信息、笔记本电脑唯一 MAC地址获取
  • 目标检测综述
  • 深度解析生成对抗网络:原理、应用与未来趋势
  • 郑庆华任同济大学党委书记
  • 乌克兰关切有中国公司帮助俄罗斯制造军事硬件,外交部:坚决反对无端指责
  • 当代读书人的暗号:不是拆快递,是拆出版社样书!|世界读书日特辑
  • 吉祥航空去年净利增超17%,海航实控人方威退出前十大股东
  • 这5种走路姿势,藏着疾病秘密,第2种你可能也有
  • 新华社经济随笔:机器人“摔倒、爬起”的背后