【C++】类和对象
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
🍅没有难懂 冗长的文字言简意赅包学包会
目录
☃️2.类
☃️3.this指针
☃️1.面向过程和面向对象
🐝1.1面向过程
面向过程就是把所有事件都拆分成过程比如下楼取快递描述成面向过程就是 第一步拿钥匙出门第二步按电梯下楼第三步根据取件码取走快递
🐝1.2面向对象
把事件解析成几个对象比如上个例子对象可以分成
对于每个对象可以通过不同实现完成对应的任务
面向对象有三大特性封装继承多态
封装的本质是一种对数据的管理手段将属性(数据和方法(函数有机结合起来然后再隐藏它们只对外暴露一些接口方便外部和对象交互
不想给别人看的用private或者protected保护开放一些公有函数对成员进行合理访问
另一个角度理解为什么C语言不适合大项目的编写因为他管理数据的能力欠缺他并不是面向对象并且结构体的数据默认可以随意访问安全性堪忧
☃️2.类
🐝2.1类的引入
把之前C语言学过的struct回顾一下
一个结构体可以定义一些属性(数据用来描述对象例如人的名字年龄性别...
但是我们从来没有见过结构体里面还可以有函数(接口比如这样是万万不行的
比如之前学习过的栈和一些数据结构的C实现我们会发现有的时候要求实现栈的10个功能写着写着你可能会忘记这个函数的参数是什么或者类型是什么或者现在需要两个栈但是各自的功能有细微不同那你还要写两遍只为了修改细微差别?????
这就是C一般不用于大型项目的书写的原因现在告诉你有一个东西叫做“类”可以把成员函数和成员变量(属性放在一起 你要写两个栈好啊那我就选择性的 从类里面拿到不同的接口实现不同的功能。或者同一个函数接口输入不同参数你说你还用struct吗????
🐝2.2类的定义
再次确认一下类是属性和方法的结合属性是成员变量即数据方法就是对这些数据的操作方法即成员函数
格式如下
当然类也支持声明和定义分开
🐝2.3类的访问限定符及封装
三种访问限定符publicprivateprotected (字面意思
在linux的学习中我们都知道权限是限制不同用户的root不受限制
此处同理访问限定 只限定类之外能不能直接访问 对类内没有限定
比如public类外可以直接访问
private和protected可以认为类外不可以直接访问
例如
这个学生类学生的名字年龄是隐私信息不希望被类外访问我设置成私有
而两个共有的函数是类外可以直接调用的
如你所见每个访问限定符的作用域就是从该访问限定符开始到下一个访问限定符
class默认的访问权限是private而struct默认是public这就是为什么学结构体没有特意学访问限定
千万记住访问限定符防的是别人而不是类里面的自己人
🐝2.4类的实例化
类可以理解为一个构想比如我设计的学生管理系统初步设想要保存学生的 姓名 年龄 性别 总成绩 这四个属性信息并且为了方便调查 我要根据以上属性总结出该校成绩和性别的关系以及成绩和年龄的关系
所以我设计出了一个类
当然这是我的方法论为什么不是直接的落地项目?因为我没有开辟空间啊
如果想让项目落地就要实例化 真正的学生管理系统是占用空间的不同的学校可能都用我的管理系统但是可能有些学校只想要年龄和成绩的关系而我们学校就想用性别和成绩的关系但是我的系统功能丰富可以随你选择功能
这就是相同的类可以有千千万万的实例化取决于需求
现在反思一下为什么C++要面向对象编程?
因为如果面向过程一旦需求改变整个过程很有可能倾覆
例如上面下楼取快递的例子我今天就是不想下楼想让爸妈回家的时候帮我拿上来
整个过程从第一步就发生改变应该变成 打电话给爸妈 爸妈回家帮我取快递...
但是面向对象就不一样 只需要在 快递员 我 快递点大叔 之间加上爸妈这个对象即可
根据上面讲的类的实例化需求改变是太正常的事情所以还是面向对象更方便一些
🐝2.5类对象模型
类对象的大小怎么计算?和结构体的内存对齐规则一样结构体保姆教学包括大小计算
但是肯定会有疑问类里面的成员函数怎么办????
类对象的大小计算不管成员函数只管成员变量和内存对齐
那为什么成员函数的储存不在类内?????
还是和实例化有关一个类可能会实例化很多对象因为需求不同嘛很正常、
但是每次实现不同功能都需要的函数开辟一下空间就太不正常了
难道一万个学校都想寻找年龄和成绩的关系这个年龄成绩函数就要被开辟一万个空间???
所以类内只保存成员变量成员函数存放在公共代码段内
注意空类大小不是0是1这一个字节不是用来存放数据仅仅表示他存在
☃️3.this指针
上面代码看起来没什么问题但是成员函数是公开的并不存在于类里那么编译器怎么知道的这个日期要给d1设置还是d2?不要说这里不是写d1d2区分了吗但是函数在公共代码段都去调用编译器是区分不出来的
C++中是通过this指针来区分他是一个成员函数的隐含参数不需要手动添加编译器默默承受即可
这个指针会指向函数运行时调用该函数的对象
所以我们没必要担心这个问题this已经帮我们做好了
常见的面试题
this指针存在哪里? 栈因为他是(隐含的形参
学会了吗?