《EffectiveC++》读书笔记(2):构造/析构/赋值运算_全球要闻
点击上方“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刷题模板等精品资料,可加他的微信免费领取。
标签:
抢先读
- 不是频繁诱导索取手机号就是诱导注册会员 星巴克、Shake Shack等将被约谈
- 江苏(无锡)-新加坡半导体企业双向交流活动顺利举行_焦点关注
- 重庆三峡有什么土特产吗 环球观天下
- 环球速看:1周以后,四大生肖收获大满贯,有钱有底气,事业爱情双收
- 温馨书吧沁茶香 心灵驿站暖人心|焦点速看
- 微速讯:哪吒汽车CEO张勇:国内新势力竞争像小朋友掐架
- 香港“过江龙”货运码头夜训 珠水竞渡争霸国际
- 再度领先!蛇口产园REIT扩募顺利上市
- 高温预警:今天辽宁河北北京等地局地最高气温可达40℃以上 世界今日报
- 当前讯息:网贷被起诉了怎么办?网贷逾期了怎么协商延期还款
- 当前关注:广东汕头:抢占数字经济赛道 发展前景可期
- 《EffectiveC++》读书笔记(2):构造/析构/赋值运算_全球要闻
- 全球滚动:每日信息:兴业银行:减费让利出实招 惠企利民
- 中信银行携手抖音京东促消费 推出618支付立减省钱购
- 性价比神卡!盈通RX 6600显卡降至1399元:8GB显存-全球信息
- 快讯:天天热头条丨2022虎年纪念币价格_2022虎年普通纪念币开始预约
- 上海2023年一季度网约车数据公布,滴滴美团占据8成市场份额!
- 数读中国 | 中非经贸合作再上新台阶
- 俄乌战争如何改变俄国打工人——产业工人篇 世界看点
- 今日热讯:多家公司披露半年报业绩预告 悦心健康预计上半年业绩大幅扭亏
- 当前视点!麦收进度已过九成!稳产保丰,小麦主产区有这些举措
- 今日最新!焦点日报:网贷延期找法务能延期吗?网贷延期收费吗合法吗?
- 男子被判“禁酒三年”?柳城法院回应:违禁撤销缓刑 每日聚焦
- A股三大指数集体收涨:深证成指七连阳 北向资金净买入超百亿元
- 今日开启!郑州中原区发放400万消费券
- 环球信息:《遗迹的声音》:把看不见、听得着的口述故事变成电影
- 天优科技总经理贺晓龙辞职 张军接任 2022年公司亏损351.22万
- 当前热点-土豆和红薯去皮后怎样保存
- 信用卡逾期后怎么做比较好?办信用卡个性化分期影响征信吗?
- 天天看热讯:韩国汽车追尾事故共致82人受伤 其中3人重伤
- 2023年车身装饰上市公司有哪些?(6月16日) 焦点快看
- 奇瑞商用车&高科石化战略合作授牌暨交车仪式圆满举行
- 警民接力物归原主
- 环球即时看!长光卫星送41颗卫星上天刷新纪录 利好矿产开发、智慧城市建设等多个行业
- 申万宏源宏观周报 · 第213期:下一轮“中性降息”的时间窗口
- 花甲死了但是全部开口了可以吃吗
- 打造优质工程!海口市基础设施类观摩会在江东新区举办-环球关注
- 要想股长久.千里共cpo 速讯
- 商务部:两个原因致全国实际使用外资以美元计下降 原因
- 京津城际列车扩容 “轨道上的京津冀”再升级-环球时讯
- 好几年前出租过一次q号,但没有收钱也没有成功诈骗到,直接被冻结了 全球球精选
- 天天信息:野生植物苏铁终于“回家”啦 天天看热讯
- 当前速看:网贷能办理个性化分期吗?网贷还不上怎么协商延期?
- 浙江金华召开打造“全民安心医保城市”金名片新闻发布会|每日报道
- 鲍春来被打过奥运会吗_鲍春来被打
- 罗湖Young|东门焕新升级!首发空间启幕,一起玩出新高度
- 《遗迹的声音》:把看不见、听得着的口述故事变成电影
- 报告:超八成毕业生希望租金占工资30%以下
- 上交所:杭州热电近期严重异常波动 依规从严对相关投资者采取监管措施-世界快讯
- 惠理集团(00806)5月末资产总值59亿美元_环球报资讯
- 拼多多赢麻了!Temu上半年GMV逼近30亿美元,挑战亚马逊不是梦?
- 国防部:加方在涉华问题上应谨言慎行
- 人民财评:构建职业教育与产业发展相融互促的良好格局|动态焦点
- 又见外资狂买百亿,A股现十年仅三次现象!
- 深圳到上海机票图片 真实_深圳到上海机票
- 速讯:网贷逾期遇到催收电话可以不接吗?网贷逾期了暂时还不上怎么办
- 【快播报】歌曲风的季节是哪个电影的插曲 经典歌曲风的季节原唱是谁
- 今日精选:华宝新能(301327.SZ)向111名激励对象授予270.58万股限制性股票
- 解码文化自信的城市样本|“文枢”焕新耀金陵——解码古都南京的文化自信样本
- 当前观点:北京市2023年普通高等学校招生志愿填报须知
- TFBOYS演唱会引爆市场:黄牛代抢加价4500元,粉丝提前抢空周边酒店
- 全球观速讯丨去宁波带什么礼物好_去宁波带什么礼物好
- 环球焦点!投资提醒:6月16日1只新股可申购
- 环球快讯:吃喝板块异动,啤酒、白酒强势飙升,食品ETF(515710)劲涨超3%
- 数学课题_数学课_天天看热讯
- 珠海一季度游客增长218.2% 四张特色牌助力文体旅复苏_时讯
- 【世界热闻】邓州市水务集团自来水公司:多措并举确保夏季汛期供水安全
- 全球讯息:曝阿莱格里会继续留在尤文,从未考虑过其他球队
- 安杰思(688581)6月16日主力资金净买入114.08万元 快看点
- 澎湃:央视恢复国足转播,是中国足球关注度提升的积极信号
- 文化和旅游部副部长会见伊朗文化和伊斯兰指导部副部长|天天要闻
- 全球观焦点:第二十一届海峡青年论坛在厦门举办
- 全球观天下!央行等五部门:加大货币政策工具支持力度 全面推进乡村振兴
- 新消息丨13宗!774亩!今年市区第二批拟出让地块清单发布!
- 无主之地2金钥匙怎么获得?无主之地2存档修改器使用方法是什么?_每日观点
- 菲林格尔: 董事由股东大会选举产生,董事会对股东大会负责,总裁由董事会聘任、对董事会负责-每日视讯
- 恒生指数、恒生科技指数周线三连涨 恒生科技指数本周涨超7.5%-焦点关注
- 国足4-0大胜不足喜,横扫垫底队靠主场哨,足协花钱请缅甸演戏
- 环球即时看![路演]大全能源:公司的销售策略仍是满产满销
- 股票出现溢价成交是什么意思 股票溢价成交是利空还是利好
- 今天小麦的价格是多少(2023小麦最新价格)-全球简讯
- 【环球热闻】邓超携妻儿看女儿演出!孙俪拎万元包,儿子身高猛长
- 广期所:关于加强2023年端午节休市期间风险管理的通知_热文
- 危险!孩子玩氢气球爆炸,妈妈大面积烧伤
- 一季度普陀区固定资产投资实现开门红
- 世界观察:“天府菜油”采风看名堂⑤丨川内油脂头部企业:“原料为王”
- 实时焦点:郭瑞民赴黔南州福泉市开展主题教育领题调研
- 最新:一二级市场估值倒挂:生物产业投资嬗变 政产金共同赋能
- 【全球独家】气体分离设备概念的上市公司有哪些?(2023/6/16)
- 环球快看点丨山东邹平市人大常委会机关二级调研员张宝武接受审查调查
- 外媒:英特尔将从德国政府获得近110亿美元的补贴
- 每日消息!房贷还不上怎么跟银行协商?房贷如何办理延期还款?|最新资讯
- 环球速递!成都这家景区,全员免费!
- 圣诺医药-B(02257)6月16日斥资170.41万港元回购3.5万股 全球快播报
- 内蒙古鄂尔多斯市在少年军校开展国防教育剪影
- 【成交分析】6月16日豆粕主力合约M2309成交128.96万手
- qq飞车领永久车(qq飞车刷永久车)_全球热文
- 因焊接工艺问题 保时捷召回911系列汽车
- 城市人群战争好玩吗 城市人群战争玩法简介
- 【天天报资讯】新华全媒+|抓好关键期 各方助力高校毕业生就业