C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏


绪论

本章我们接着对类和对象进行探索,这是一个在我们c++中比较重要的知识点,下面我们才是我们类和对象的更加深入且困难的知识点,希望你能通过这篇文章对类其有更加深入的了解。

话不多说安全带系好,发车啦(建议电脑观看)。


附:红色,部分为重点部分;蓝颜色为需要记忆的部分(不是死记硬背哈,多敲);黑色加粗或者其余颜色为次重点;黑色为描述需要


思维导图:

要XMind思维导图的话可以私信哈


目录

1.类的6个默认成员函数

2.构造函数、析构函数

2.1构造函数的调用:

2.2析构函数的细节

3.拷贝构造函数

4.赋值运算符重载

4.1运算符重载:

4.2赋值运算符重载:

5.const成员

6.取地址及const取地址操作符重载


1.类的6个默认成员函数

知识点:

6个默认成员函数:

构造函数、析构函数、拷贝构造函数、赋值运算符重载函数取地址操作符重载、const修饰的取地址操作符重载,对于这6个默认成员函数来说假如你不去写他就会操作系统会默认生成一个


2.构造函数、析构函数

知识点:

在我们写数据结构的时候需要去写初始化和摧毁的函数,而在我们写程序的时候很多时候都容易忘记写 ;

所以c++对此进行了处理就对应的创造出默认成员函数中的构造函数(初始化)和析构函数(销毁

细节:

构造函数:是特殊的成员函数,其实构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象

构造函数的写法:

1. 函数名与类名相同。
2. 无返回值。
3. 对象实例化时编译器自动调用对应的构造函数。
4. 构造函数可以重载。

5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成(但注意的是默认生成的不会对内置类型(int char ....)进行初始化(其实编译器有些还是会处理的),一般都只会对自定义类型(struct class union....)进行初始化(并且这个自定类型必须有默认构造函数))

因为内置类型的原因所以在c++11的时候打了个补丁可以给内置类型加上缺省值:

6.如果当成员变量都是自定义类型的时候就可以不用直接写构造函数(反之如果只有内置类型就需要去自己写构造函数/给缺省值)


析构函数:析构函数不是对对象本身的销毁,局部对象销毁工作是由编译器完成的,主要工作是销毁借来的动态空间。对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。并且后创建的先销毁,这里点和栈有点像
析构函数的写法:
1. 析构函数名是在类名前加上字符 ~
2. 无参数无返回值类型
3. 一个类只能有一个析构函数。若未显式定义,同样系统会自动生成默认的析构函数。注意:析构函数不能重载
4. 对象生命周期结束时,C++编译系统系统自动调用析构函数         

2.1构造函数的调用:

当创建了一个自己的构造函数时,我们其实也不一定要编译器自动调用,我们也可以自己调用,但要注意自己调用时的写法,他和一般的函数调用有着很大的区别。

在创建类时进行调用的写法

进一步优化到:

附:

而这种优化,就推出了另外一个对于构造函数的点:

也就是默认构造函数只能存在一个

什么是默认构造函数呢? : 无参数的构造函数(上图注释了的)、全缺省的构造函数(上图第二个构造函数)、没写时编译器自动创建的构造函数。


总结:

  1. 一般来说构造函数都需要自己写
  2. 不用初始化的情况
    1. 全是自定义类型(自定义类型会去调用自身的默认构造(全缺省、无参的、默认生成的))
    2. 有内置类型并且有符合的缺省值

练习:

a.自动调用举例演示

直接调用自身构造

此时我们并没有调用构造和析构函数他们是编译器自动调用

b.间接调用构造
创建一个新的对象此时内部都是自定义类型

因为pushsk、popsk的自定义类型是Stack所以说需要Stack内有符合的默认构造函数 

最终就能顺利的对自定义类型初始化


2.2析构函数的细节

  1. 析构函数会在对象的生命周期结束时自动调用(无论是自己写的还是默认生成的)
  2. 默认生成的同样不会对内置类型进行释放(主要是要释放堆上申请的空间防止内存泄漏(此处不做处理)、对于其余的自定义类型也不需要我们去释放他们在栈上结束时也会归还给操作系统)

总结来说:

  1. 当有动态申请的空间时需要写析构、反之没有动态申请是资源时就不需要我们去写即使有内置类型
  2. 当全部是自定义类型的时候也不用我们写析构函数

3.拷贝构造函数

知识点:

  1.  拷贝构造函数其实是构造函数的一个重载形式
  2. 参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用附:因为当自定义类型传值调用时要先调用拷贝构造来进行传参时的拷贝、然而在拷贝构造中的参数类型假如我们不用引用,那么就又在拷贝构造处进行了自定义类型的传值调用,这样就会导致无限循环)无穷递归展示:当我们用引用接收(用指针也行),就能解决这个问题
  3.  一般我们会在拷贝构造中的参数加上const防止被改变
  4. 同样当我们自己不写拷贝构造时,编译器会自动生成     

    1. 对内置类型进行浅拷贝、值拷贝(完成字节序的值拷贝, 直接将数据拷贝过去)
    2. 对自定义类型会调用他们自己的拷贝构造,过程可能是浅拷贝 / 深拷贝 (针对申请的空间)

  5. 拷贝构造函数典型调用场景:

    1. 使用已存在对象创建新对象(拷贝构造)

    2. 函数参数类型为类类型对象(引用)

    3. 函数返回值类型为类类型对象(引用)

细节:

  1. 深拷贝和浅拷贝的区别: 深拷贝是针对申请的空间的,对一个动态申请的空间进行拷贝时,不能像内置类型那样直接完成字节序的拷贝(浅拷贝),如果这样会导致拷贝后,两个对象指向同一个申请的空间,当一边改变时会导致另一边受影响 / 他们会重复的进行析构函数释放同一块空间而报错,所以说此时就需要我们自己去写一个拷贝构造(深拷贝,具体看下图,就和构造函数差不多不过要有参数且必须是类对象的引用类型的,然后内部就再申请一块空间给*this,然后将数据拷贝的到新空间中即可,来防止这样的错误发生。
  2. c++规定对内置类型来说是直接拷贝(浅拷贝),对自定义类型来说要进行拷贝构造

4.赋值运算符重载

知识点:

4.1运算符重载:

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表。其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator+运算符符号。
函数原型:返回值类型 operator操作符(参数列表)


总结来说:运算符重载就是让自定义类型也能和内置类型一样去使用一些操作符(+ - * /)为此去创建一个专属于自定义类型的操作符

如:

此时这个+=就是一个运算符重载,他其实会其调用我们写好的运算符重载函数 


细节:

  1.  (  .* ) ( :: ) (sizeof )  (?  :) ( . )  注意以上5个运算符不能重载
  2. 是否要去对重载运算符,取决于对你是否需要、是否有意义
  3. 注意对于在写赋值运算符重载时需要把返回值写成 Date &  因为我们需要连续赋值
  4. 用于内置类型的运算符时不能改变其含义,例如:内置的整型+,不能改变+的含义
  5. 不能通过连接其他符号来创建新的操作符:比如operator@

4.2赋值运算符重载:

  1. 知识点:

本质也是运算符重载,但是赋值运算符是一个默认成员函数

参数类型:const T&,传递引用可以提高传参效率
返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值
返回*this :要复合连续赋值的含义

T & operator=(const T&)  其中T是对象名 如 Date& operator=(const Date& d1)

细节:     

  1. 我们需要在赋值时分清构造函数和运算符重载的区别
    1. 构造函数是在一个对象给另一个对象初始化时的赋值操作(Date d3(d1) 等价于 Date d3 = d1)
    2. 运算符重载是对两个已经创建好的对象进行时的赋值操作       
  2. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载以值的方式逐字节拷贝(和拷贝构造一样,自定义去调用其赋值重载,内置类型进行浅拷贝),所以说对于像Stack这种不全是内置类型成员的对象需要自己去写一个赋值运算符重载
  3. 赋值运算符只能重载成类的成员函数不能成重载成全局函数(因为他是默认成员函数,当写在全局时,类就会再默认生成一个,这样就会发生冲突)

练习:

实现cout 、 cin

这是cout  、cin 所在的类分别是ostream  、 istream

ostream& operator<<(ostream& out,const Date& d)//返回值是 out 为了可以连续使用
{
//ostream是cout的类对象,也是库iostream定义的
	out << d._year << "年" << d._month << "月" << d._day << "天" << endl;
//内部就把out当cout使用即可
	return out;
}

istream& operator>>(istream& in, Date& d)//同理要返回 istream& 
{
	in >> d._year >> d._month >> d._day;//同理 ....
	return in;
}

注意因为<< >> 他们有两个操作数 (cout << d1;)

而若是 成员函数 的话第一个参数的位置一定是   *this  , 而我们需要把第一个参数放成 cout

所有对此我们重载 <<  >> 时不能写成 成员函数 而是需要写成一个全局函数

并且因为我们需要使用到  成员日期类对象的成员变量   所以我们要使用到一个超纲的知识点   友元函数,加上友元函数后我们就能    直接在全局函数中去使用类中的私有  

在类中写: friend ostream& operator<<(ostream& out,const Date& d)


5.const成员

知识点:

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
总结来说就是为了改变this指针类型,将this指针的类型改成const Date ...

细节:

  1. 我们可以把所有不需要改变成员变量的成员函数全部写成const成员型

向上面这种没对this加const当遇到const类型时就不行了,所以为了防止这种情况我们对不需要改变的尽量都加上const , 这样对于正常的 Date -> const Date 算是范围的缩小 , 而对于const那也能使用了


练习:

实现日期类


6.取地址及const取地址操作符重载

知识点:

这两个是剩下的最后两个默认成员函数,还是比较简单的,就是会默认重载取地址操作符

对此直接通过代码可以更好的展示:

默认生成的:

重载自己的:


本章完。预知后事如何,暂听下回分解。

持续更新大量C++细致内容,三连关注哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/19973.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】shell编程之—函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、概述二、函数的查看和删除1.查看 declare2.删除 declare 三、函数的返回值1.return 返回值2.echo 返回值 四、函数的参数传入与变量范围五、函数的应用1.阶乘2.…

GPT神奇应用:给孩子做每日安排

正文共 1163 字&#xff0c;阅读大约需要 4 分钟 家长必备技巧&#xff0c;您将在4分钟后获得以下超能力&#xff1a; 快速生成每日安排计划 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片…

前端部署vue项目到腾讯云服务器

先把dist包上传服务器 可以使用宝塔、FileZilla、手动上传等等方式 已有腾讯云服务器之后进入面板界面 然后安装Nginx 请一步一步&#xff0c;紧跟步骤 第一步 安装gcc-c 编译器。nginx依赖的 pcre 和 zlib 包 yum -y install gcc zlib zlib-devel pcre-devel openssl openss…

Java中的七种设计原则

1.开闭原则 对扩展开放&#xff0c;对修改关闭。在程序需要进行扩展的时候&#xff0c;不能去修改原有的代码&#xff0c;要去实现一个热插拔的效果。简言之&#xff0c;是为了使程序的扩展性好&#xff0c;易于维护和升级。 下面是输入法设置皮肤的例子&#xff1a; // 抽象皮…

制造业为什么要数字化?有何意义?

制造业为什么要数字化&#xff1f;有何意义&#xff1f; 党的二十大报告指出&#xff0c;要“坚持把发展经济的着力点放在实体经济上&#xff0c;推进新型工业化”“促进数字经济和实体经济深度融合”。 新一代信息技术催生第四次工业革命&#xff0c;互联网、大数据、人工智能…

【五一创作】自动驾驶技术未来大有可为

本文概要 自动驾驶技术是当今汽车行业的发展热点之一&#xff0c;但其也存在着许多争议。大家也可以从以下几个维度谈谈你对这项技术的看法。 &#x1f31f;&#x1f31f;&#x1f31f;个人简介&#x1f31f;&#x1f31f;&#x1f31f; ☀️大家好&#xff01;我是新人小白博…

带头双向循环链表(增、删 、查、改)基本操作详细介绍 必看!!!

文章目录 链表介绍链表初始化链表打印查找元素增加节点头插尾插在指定位置插入 删除节点头删尾删删除指定位置节点 链表判空获取链表中元素的个数链表销毁 链表介绍 前面说到&#xff0c;链表的结构一共有八种&#xff1a;带头单向循环链表、带头单向非循环链表、带头双向循环…

《编码——隐匿在计算机软硬件背后的语言》精炼——第17章(自动操作)

夫道成于学而藏于书&#xff0c;学进于振而废于穷。 文章目录 完善加法器加入代码的加法器扩大加数范围自由调用地址的加法器合并代码RAM和数据RAMJump指令硬件实现条件Jump指令零转移的硬件实现条件Jump指令的例子 总结 完善加法器 我们在第14章介绍了一个可以进行连加的加法…

ChatGPT都有些什么好玩的玩法?

ChatGPT是一个智能聊天机器人&#xff0c;可以进行多种有趣的玩法&#xff0c;以下是其中一些&#xff1a; 1. 问答游戏&#xff1a;ChatGPT可以回答各种问题&#xff0c;你可以和它玩问答游戏&#xff0c;看看谁更聪明。 2. 聊天互动&#xff1a;ChatGPT可以进行自然语言聊天…

自学黑客【网络安全】,一般人我劝你还是算了吧

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 我一直强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且实际向安全过渡后可用到的关键…

分区计量管理项目应用

为充分发挥分区计量管理项目在漏损控制的效用&#xff0c;应构建科学完备的应用体系&#xff0c;如下图 分区计量应用体系 1. 基于水量平衡分析的漏损现状评估方法 分区计量管理项目通过监控分析DMA 分区内流量、压力、水质、大用户用水等情况&#xff0c;结合营业抄收系统的营…

win10中rclone挂载minio的多实例安装方式

1.下载rclone安装包&#xff0c;复制多个.exe并重命名 2.1添加rclone1server.xml <service><id>rclone1</id><name>rclone1</name><description>rclone1service</description><executable>rclone</executable><argum…

LeetCode_二叉树_简单_112.路径总和

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum。判断该树中是否存在 根节点到叶子节点的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum。如果存在&#xff0c;返回 true&#…

【学习笔记】低速数字输入电路

1、方案设计&#xff1a;单通道、单向、反相器 该电路采用单通道&#xff0c;单向光耦&#xff0c;只支持漏型输入&#xff0c;电路的输入端压差满足24V DC10%(21.6V DC-26.4V DC)&#xff0c;输出端电压在0~3.3V范围摆动。 1.1关键技术规格 1.2具体原理图 1.3电路原理详解 …

Java版本电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境&#xff0c;促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标…

如何利用生产管理系统提高粉末治金工业的生产调度能力

在粉末冶金工业中&#xff0c;生产管理系统的应用已经成为了一个必不可少的部分。生产管理系统可以帮助企业实现自动化、信息化、智能化的生产&#xff0c;提高生产效率、降低生产成本、提高产品质量。生产管理系统可以对生产流程进行全面的监控和管理&#xff0c;从而实现生产…

Android还要继续学习吗?高薪高级开发领先位置占据一席之地

Android开发还有必要学习吗 &#xff1f; 我们来看Android从业大佬的回答&#xff1b;从回答中可以读取出一些信息&#xff0c;Android市场仍有岗位需求&#xff0c;只不过减少许多初级Android开发岗位。对于中高端市场还是面临着缺少人才&#xff1b;因为初级开发人员多啊&am…

Adobe Photoshop 2022版 功能介绍及使用技巧

目录 版本介绍&#xff1a; 使用技巧&#xff1a; 截图展示&#xff1a; 分享 版本介绍&#xff1a; Adobe Photoshop 2022是Adobe公司的一款专业的图像处理软件&#xff0c;它提供了强大的图像处理功能&#xff0c;从色彩调整&#xff0c;图层处理到高级合成等功能。新版…

AP3266 DC-DC大功率同步降压恒流芯片 过EMC三级 摩托电动汽车灯IC

1&#xff0c;产品描述 AP3266 是高效率、外围简单、内置功率管的同步降压恒流芯片&#xff0c;适用于4-40V输入的降压LED恒流驱动芯片。输出功率可达 40W&#xff0c;电流3.6A。AP3266 可通过调节 OVP 端口的分压电阻&#xff0c;设定输出空载电压 保护&#xff0c;避免高压 空…

Jmeter和Postman那个工具更适合做接口测试?

软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人在做的接口测试&#xff0c;小白变高手…