品牌 资讯 搭配 材料 时尚 热点 行业 首饰 玉石 行情

《EffectiveC++》读书笔记(2):构造/析构/赋值运算-环球视点

2023-06-16 17:58:24 来源:面包芯语

点击上方“C语言与CPP编程”,选择“关注/置顶/星标公众号”

干货福利,第一时间送达!最近有小伙伴说没有收到当天的文章推送,这是因为微信改了推送机制,确实会一部分有小伙伴刷不到当天的文章,一些比较实用的知识和信息,错过了就是错过了。所以建议大家加个星标⭐️,就能第一时间收到推送了。


(资料图)

小伙伴们大家好,我是飞宇。

今天继续更新《Effective C++》和《C++并发编程实战》的读书笔记,下面是已经更新过的内容:

《C++并发编程实战》读书笔记(1):并发、线程管控

《C++并发编程实战》读书笔记(2):并发操作的同步

《Effective C++》读书笔记(1):让自己习惯C++

条款5、了解C++默认编写并调用哪些函数

通常情况下,如果代码中没有声明构造函数、拷贝构造函数、拷贝运算符、析构函数,编译器会在需要时创建他们,但这往往只能满足编译器的需求,很可能无法满足程序的需求。

实际的生成规则复杂一些,可以查阅cppreference。

编译器生成的构造函数/析构函数是只是调用基类和非静态成员变量的构造函数/析构函数;生成的析构函数是非虚的,除非基类有虚析构函数。

至于生成的拷贝构造函数和拷贝操作符只是单纯将每个非静态成员变量拷贝;有const成员或者引用成员时,以及基类拒绝拷贝操作符时,默认生成的拷贝操作符没有意义,必须自己定义。

条款6、若不想使用编译器自动生成的函数,就该明确拒绝

很多时候,你并不希望某些类被拷贝,而仅仅不实现拷贝构造/拷贝运算符是不够的,因为编译器可能会自行生成。

为此,可以把拷贝构造/拷贝运算符声明为"=delete",或者声明为private(后者较为过时)。

事实上,对于析构函数中需要释放资源的类,为了防止内存问题,除非真的需要拷贝功能,否则最好都禁止拷贝。

可以让它们继承上面的类,即可禁止编译器生成拷贝操作:编译器试图为它们生成拷贝构造/拷贝运算符时会尝试调用基类Uncopyable的对应操作,而这会被拒绝。

条款7、为多态基类声明virtual析构函数

C++中多态性质体现于虚函数:基类指针或引用调用虚函数时会检查指向的对象是基类还是派生类,再调用对应的函数。其具体实现这里不再赘述。

当这样的一个指向派生类的基类指针析构时,如果析构函数不是虚函数,则直接调用基类的析构函数,那么派生类获取的资源未释放,则会造成内存泄漏。

而当析构函数是虚函数时则先调用对应的派生类析构函数,再调用基类析构函数,资源全部释放。

不过这种操作只有在基类是多态用途时才需要注意,也有很多类不是为了多态的用途,例如STL容器和上文的Uncopyable。

条款8、别让异常逃离析构函数

C++中抛出异常时会逐步展开其函数调用栈,清空局部资源,直到异常被catch。

如果析构函数可以抛出异常,那么清空局部资源时局部对象的析构函数再次异常时同时存在两个异常,C++无法处理,可能会过早结束或出现不明确行为。因此,析构函数绝对不要抛出异常,应通过try-catch捕获任何异常。

有时,客户需要处理某些异常,那么类应该提供一个普通成员函数执行相关操作,供用户调用并处理异常。

例如数据库连接这样的类中,假设用户需要处理关闭连接时的异常,同时析构函数不能抛出异常,可以这样:

条款9、绝不在构造和析构过程中调用virtual函数

C++的构造过程是先构造基类再构造子类、先初始化再进入构造函数体;析构过程相反。

对于派生类的构造函数而言,进入其中时基类部分已构造完而派生类部分未构造完,对象类型是基类,故而此时调用虚函数,实际上使用的是基类的虚函数。

析构函数同理。进入析构函数后派生类部分呈未定义值,对象类型是基类,调用的是基类的虚函数。

总而言之,在构造函数与析构函数中虚函数的行为有特殊变化;为了避免出错,不要在其过程中使用虚函数。如果真的有需求,可以改造成非虚函数再使用。

条款10、令operator=返回一个reference to *this

C++中通常支持连锁赋值,采用右结合律:

为了支持这个常规,拷贝运算符需要返回一个引用。这一条款并不强制,但约定俗成。

条款11、在operator=中处理“自我赋值”

考虑这样一个类,其中管理了一个堆对象

总有些时候,会出现实质上“a=a”这种自我赋值的情况。那么这样简单的拷贝运算符就会出错,先释放了自身的pb,又使用了pb:

传统做法是函数开头添加一个测试:

这种做法具备“自我赋值安全性”,但不具备“异常安全性”:例如当new Bitmap异常时,pb指向被删除的内存。

常用的方法有两种,兼顾了“自我赋值安全性”与“异常安全性”:

条款12、复制对象时勿忘其每一个成分

当自己实现拷贝构造/拷贝运算符时,编译器不会警告你遗漏了某些成员变量。因此,必须仔细地复制所有派生类成员,并调用基类的拷贝操作来复制基类成员。

拷贝构造和拷贝运算符中很可能有相当多重复的操作,但因为两个函数性质完全不同,因此不能用其中一个调用另一个来减少冗余。

可以把共同功能放在第三个函数中,并由两个拷贝操作共同调用。

你好,我是飞宇,本硕均于某中流985 CS就读,先后于百度搜索以及字节跳动电商等部门担任Linux C/C++后端研发工程师。

同时,我也是知乎博主@韩飞宇,日常分享C/C++、计算机学习经验、工作体会,欢迎点击此处查看我以前的学习笔记&经验&分享的资源。

有个朋友收集了一些C++开发手册、LeetCode刷题模板等精品资料,可加他的微信免费领取。

标签:

相关文章

《EffectiveC++》读书笔记(2):构造/析构/赋值运算-环球视点

​点击上方“C语言与CPP编程”,选择“关注 置顶 星标公众号”干货福利,

2023-06-16 17:58:24

成败难料,服装企业转型新能源造梦忙

​成败难料,服装企业转型新能源造梦忙

2023-06-16 17:15:04

世界聚焦:阿迪达斯椰子沼泽侧透 Adidas Yeezy 350V2 Boost Marsh 满天星低帮运动鞋

​阿迪达斯椰子沼泽侧透AdidasYeezy350V2BoostMarsh满天星低帮运动鞋FX90

2023-06-16 16:57:19

天天短讯!天天热资讯!省检一分院领导以“四不两直”方式督导检察院机关主题教育开展情况

​6月14日下午,省检察院党组成员,省检察院第一分院党组书记、检察长、

2023-06-16 16:41:04

当前观察:“他不是忘了,是对母亲的报复”,没涂答题卡事件,再给母亲插刀

​“他不是忘了,是对母亲的报复”,没涂答题卡事件,再给母亲插刀,中考,

2023-06-16 16:09:41

最新:新闻有观点·行业洞察丨音乐节,城市文旅下一张“新名片”?

​自由音乐人李源也曾随乐队参与过多场国内外音乐节的演出,他说,今年的

2023-06-16 15:53:10

自动化机器人市场现状及前景分析2023-全球观速讯

​机器人是我国未来重点发展的方向之一。由工信部等十七部门印发的《“机

2023-06-16 15:22:38

今日快讯:河南工勤证书打印2020_河南工勤证书打印

​1、打开打印机。2、登录后,点击“进入学习”再点击“教育经历”,点击

2023-06-16 15:12:16

讯息:济南城投挂牌转让立园文旅,底价4.32亿元

​6月16日,济南立园文旅产业发展有限公司100%国有股权及债权在山东产权

2023-06-16 14:52:18

又一位前旭辉高管离职,回到了生涯第一站 全球滚动

​又一位前旭辉高管离职,回到了生涯第一站,万科,胡翔,代建,房地产,旭辉

2023-06-16 14:05:47

每日看点!小于号怎么打出来

​1、四个步骤。2、1,首先,我们要在iPhone手机默认键盘的中文拼音,输入法

2023-06-16 14:02:34

环球今日讯!自由,不只是做自己而已

​舒适自由的身体状态,帮助你享受生活中每一刻美好,追求自由的脚步和探

2023-06-16 13:14:18

夏季达沃斯论坛将于6月27日至29日在天津举行

​记者今天(16日)从国家发改委了解到,世界经济论坛第十四届新领军者年

2023-06-16 12:57:21

世界热点评!途胜天窗骨架多少钱?价格区间、参考案例全解析

​途胜天窗骨架多少钱途胜作为一款备受瞩目的SUV车型,其天窗骨架是许多

2023-06-16 12:40:19

西平县开展防范非法集资集中宣传活动 全球热资讯

​6月15日,西平县在柏城大道东段组织开展防范非法集资集中宣传活动。副

2023-06-16 12:07:08

当前快看:2023杨宗纬黑龙江的演出怎么购票

​丹降祥合47°星空音乐嘉年华演出时间:6月21-24日演出地点:齐齐哈尔市

2023-06-16 12:06:08

利息债权的诉讼时效,如何确定起算点?

​利息债权系基于本金债权而产生的从权利,具有从属性和附随性。利息

2023-06-16 11:26:06

环球观点:AI概念第一股,居然是人力外包?

​文:诗与星空(ID:SingingUnderStars)无论是生活还是工作还是业余兴趣爱

2023-06-16 11:25:52

赏石感悟:社交人生

​赏石感悟:社交人生社会的交往就像是开出租车的司机,在不同的地点

2023-06-16 11:03:29

全球微速讯:《最终幻想16》新宣传片 两种模式玩家都能轻松上手

​《最终幻想16》还有一周时间不到就要正式发售了,现在SE官方公布了最新

2023-06-16 11:03:24

48所地方高校招收定向培养军士

​河南日报记者周晓荷6月15日,记者获悉,按照相关通知,今年共有48所地

2023-06-16 10:40:43

全球新资讯:关于必然会的文案

​然会的文案1、人生中出现的一切,都无法拥有,只能经历。深知这一点的

2023-06-16 10:26:16

【世界新视野】我省打击非法集资违法犯罪取得明显成效

​我省打击非法集资违法犯罪取得明显成效,主流媒体,山西门户。山西新闻网

2023-06-16 10:09:03

全球消息!便民利民!黔西南州2023年7月驾驶证考试安排计划表出炉

​  有很多网友咨询我们  有没有科目一考试的时间呐?  想报名考试

2023-06-16 09:59:11

每日速递:特斯拉 Model 3 充电冒白烟!车主再也不想供养电动爹了

​日前有消息称,广东洪女士刚买特斯拉Model3不到一个月,在充电时发现车

2023-06-16 09:44:06

团子的做法视频教程_团子的做法-焦点要闻

​1、将除饺子外的所有材料混合搅拌,包括油和糖。加水或牛奶,搅拌至表

2023-06-16 09:15:22

海洋油气装备持续进步-天天短讯

​近年来,我国油气勘探开发加快向深海挺进、增储上产持续发力,很大程度

2023-06-16 09:15:22

“田经理”定投周记:两稀指数性价比突显,还有反弹行情吗?

​嘉实基金经理田光远的定投周计划系列上周全市场几乎都在下行,两稀指数

2023-06-16 08:41:23

广场舞可持续发展路径探讨论文 每日时讯

​乐乐学教研网精心为你收集整理了广场舞可持续发展路径探讨论文(共16篇

2023-06-15 19:18:21

【全球独家】2023年山东潍坊市教育局所属学校公开招聘面试递补公告

​因部分考生放弃面试资格,根据《2023年潍坊市教育局所属学校公开招聘工

2023-06-15 19:00:53