《EffectiveC++》讀書筆記(2):構(gòu)造/析構(gòu)/賦值運(yùn)算_全球要聞
點(diǎn)擊上方“C語(yǔ)言與CPP編程”,選擇“關(guān)注/置頂/星標(biāo)公眾號(hào)”
干貨福利,第一時(shí)間送達(dá)!最近有小伙伴說沒有收到當(dāng)天的文章推送,這是因?yàn)槲⑿鸥牧送扑蜋C(jī)制,確實(shí)會(huì)一部分有小伙伴刷不到當(dāng)天的文章,一些比較實(shí)用的知識(shí)和信息,錯(cuò)過了就是錯(cuò)過了。所以建議大家加個(gè)星標(biāo)??,就能第一時(shí)間收到推送了。
小伙伴們大家好,我是飛宇。
(資料圖)
今天繼續(xù)更新《Effective C++》和《C++并發(fā)編程實(shí)戰(zhàn)》的讀書筆記,下面是已經(jīng)更新過的內(nèi)容:
《C++并發(fā)編程實(shí)戰(zhàn)》讀書筆記(1):并發(fā)、線程管控
《C++并發(fā)編程實(shí)戰(zhàn)》讀書筆記(2):并發(fā)操作的同步
《Effective C++》讀書筆記(1):讓自己習(xí)慣C++
條款5、了解C++默認(rèn)編寫并調(diào)用哪些函數(shù)
通常情況下,如果代碼中沒有聲明構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、拷貝運(yùn)算符、析構(gòu)函數(shù),編譯器會(huì)在需要時(shí)創(chuàng)建他們,但這往往只能滿足編譯器的需求,很可能無法滿足程序的需求。
實(shí)際的生成規(guī)則復(fù)雜一些,可以查閱cppreference。
編譯器生成的構(gòu)造函數(shù)/析構(gòu)函數(shù)是只是調(diào)用基類和非靜態(tài)成員變量的構(gòu)造函數(shù)/析構(gòu)函數(shù);生成的析構(gòu)函數(shù)是非虛的,除非基類有虛析構(gòu)函數(shù)。
至于生成的拷貝構(gòu)造函數(shù)和拷貝操作符只是單純將每個(gè)非靜態(tài)成員變量拷貝;有const成員或者引用成員時(shí),以及基類拒絕拷貝操作符時(shí),默認(rèn)生成的拷貝操作符沒有意義,必須自己定義。
條款6、若不想使用編譯器自動(dòng)生成的函數(shù),就該明確拒絕
很多時(shí)候,你并不希望某些類被拷貝,而僅僅不實(shí)現(xiàn)拷貝構(gòu)造/拷貝運(yùn)算符是不夠的,因?yàn)榫幾g器可能會(huì)自行生成。
為此,可以把拷貝構(gòu)造/拷貝運(yùn)算符聲明為"=delete",或者聲明為private(后者較為過時(shí))。
事實(shí)上,對(duì)于析構(gòu)函數(shù)中需要釋放資源的類,為了防止內(nèi)存問題,除非真的需要拷貝功能,否則最好都禁止拷貝。
可以讓它們繼承上面的類,即可禁止編譯器生成拷貝操作:編譯器試圖為它們生成拷貝構(gòu)造/拷貝運(yùn)算符時(shí)會(huì)嘗試調(diào)用基類Uncopyable的對(duì)應(yīng)操作,而這會(huì)被拒絕。
條款7、為多態(tài)基類聲明virtual析構(gòu)函數(shù)
C++中多態(tài)性質(zhì)體現(xiàn)于虛函數(shù):基類指針或引用調(diào)用虛函數(shù)時(shí)會(huì)檢查指向的對(duì)象是基類還是派生類,再調(diào)用對(duì)應(yīng)的函數(shù)。其具體實(shí)現(xiàn)這里不再贅述。
當(dāng)這樣的一個(gè)指向派生類的基類指針析構(gòu)時(shí),如果析構(gòu)函數(shù)不是虛函數(shù),則直接調(diào)用基類的析構(gòu)函數(shù),那么派生類獲取的資源未釋放,則會(huì)造成內(nèi)存泄漏。
而當(dāng)析構(gòu)函數(shù)是虛函數(shù)時(shí)則先調(diào)用對(duì)應(yīng)的派生類析構(gòu)函數(shù),再調(diào)用基類析構(gòu)函數(shù),資源全部釋放。
不過這種操作只有在基類是多態(tài)用途時(shí)才需要注意,也有很多類不是為了多態(tài)的用途,例如STL容器和上文的Uncopyable。
條款8、別讓異常逃離析構(gòu)函數(shù)
C++中拋出異常時(shí)會(huì)逐步展開其函數(shù)調(diào)用棧,清空局部資源,直到異常被catch。
如果析構(gòu)函數(shù)可以拋出異常,那么清空局部資源時(shí)局部對(duì)象的析構(gòu)函數(shù)再次異常時(shí)同時(shí)存在兩個(gè)異常,C++無法處理,可能會(huì)過早結(jié)束或出現(xiàn)不明確行為。因此,析構(gòu)函數(shù)絕對(duì)不要拋出異常,應(yīng)通過try-catch捕獲任何異常。
有時(shí),客戶需要處理某些異常,那么類應(yīng)該提供一個(gè)普通成員函數(shù)執(zhí)行相關(guān)操作,供用戶調(diào)用并處理異常。
例如數(shù)據(jù)庫(kù)連接這樣的類中,假設(shè)用戶需要處理關(guān)閉連接時(shí)的異常,同時(shí)析構(gòu)函數(shù)不能拋出異常,可以這樣:
條款9、絕不在構(gòu)造和析構(gòu)過程中調(diào)用virtual函數(shù)
C++的構(gòu)造過程是先構(gòu)造基類再構(gòu)造子類、先初始化再進(jìn)入構(gòu)造函數(shù)體;析構(gòu)過程相反。
對(duì)于派生類的構(gòu)造函數(shù)而言,進(jìn)入其中時(shí)基類部分已構(gòu)造完而派生類部分未構(gòu)造完,對(duì)象類型是基類,故而此時(shí)調(diào)用虛函數(shù),實(shí)際上使用的是基類的虛函數(shù)。
析構(gòu)函數(shù)同理。進(jìn)入析構(gòu)函數(shù)后派生類部分呈未定義值,對(duì)象類型是基類,調(diào)用的是基類的虛函數(shù)。
總而言之,在構(gòu)造函數(shù)與析構(gòu)函數(shù)中虛函數(shù)的行為有特殊變化;為了避免出錯(cuò),不要在其過程中使用虛函數(shù)。如果真的有需求,可以改造成非虛函數(shù)再使用。
條款10、令operator=返回一個(gè)reference to *this
C++中通常支持連鎖賦值,采用右結(jié)合律:
為了支持這個(gè)常規(guī),拷貝運(yùn)算符需要返回一個(gè)引用。這一條款并不強(qiáng)制,但約定俗成。
條款11、在operator=中處理“自我賦值”
考慮這樣一個(gè)類,其中管理了一個(gè)堆對(duì)象
總有些時(shí)候,會(huì)出現(xiàn)實(shí)質(zhì)上“a=a”這種自我賦值的情況。那么這樣簡(jiǎn)單的拷貝運(yùn)算符就會(huì)出錯(cuò),先釋放了自身的pb,又使用了pb:
傳統(tǒng)做法是函數(shù)開頭添加一個(gè)測(cè)試:
這種做法具備“自我賦值安全性”,但不具備“異常安全性”:例如當(dāng)new Bitmap異常時(shí),pb指向被刪除的內(nèi)存。
常用的方法有兩種,兼顧了“自我賦值安全性”與“異常安全性”:
條款12、復(fù)制對(duì)象時(shí)勿忘其每一個(gè)成分
當(dāng)自己實(shí)現(xiàn)拷貝構(gòu)造/拷貝運(yùn)算符時(shí),編譯器不會(huì)警告你遺漏了某些成員變量。因此,必須仔細(xì)地復(fù)制所有派生類成員,并調(diào)用基類的拷貝操作來復(fù)制基類成員。
拷貝構(gòu)造和拷貝運(yùn)算符中很可能有相當(dāng)多重復(fù)的操作,但因?yàn)閮蓚€(gè)函數(shù)性質(zhì)完全不同,因此不能用其中一個(gè)調(diào)用另一個(gè)來減少冗余。
可以把共同功能放在第三個(gè)函數(shù)中,并由兩個(gè)拷貝操作共同調(diào)用。
你好,我是飛宇,本碩均于某中流985 CS就讀,先后于百度搜索以及字節(jié)跳動(dòng)電商等部門擔(dān)任Linux C/C++后端研發(fā)工程師。
同時(shí),我也是知乎博主@韓飛宇,日常分享C/C++、計(jì)算機(jī)學(xué)習(xí)經(jīng)驗(yàn)、工作體會(huì),歡迎點(diǎn)擊此處查看我以前的學(xué)習(xí)筆記&經(jīng)驗(yàn)&分享的資源。
有個(gè)朋友收集了一些C++開發(fā)手冊(cè)、LeetCode刷題模板等精品資料,可加他的微信免費(fèi)領(lǐng)取。
標(biāo)簽:
搶先讀
- 不是頻繁誘導(dǎo)索取手機(jī)號(hào)就是誘導(dǎo)注冊(cè)會(huì)員 星巴克、Shake Shack等將被約談
- 江蘇(無錫)-新加坡半導(dǎo)體企業(yè)雙向交流活動(dòng)順利舉行_焦點(diǎn)關(guān)注
- 重慶三峽有什么土特產(chǎn)嗎 環(huán)球觀天下
- 環(huán)球速看:1周以后,四大生肖收獲大滿貫,有錢有底氣,事業(yè)愛情雙收
- 溫馨書吧沁茶香 心靈驛站暖人心|焦點(diǎn)速看
- 微速訊:哪吒汽車CEO張勇:國(guó)內(nèi)新勢(shì)力競(jìng)爭(zhēng)像小朋友掐架
- 香港“過江龍”貨運(yùn)碼頭夜訓(xùn) 珠水競(jìng)渡爭(zhēng)霸國(guó)際
- 再度領(lǐng)先!蛇口產(chǎn)園REIT擴(kuò)募順利上市
- 高溫預(yù)警:今天遼寧河北北京等地局地最高氣溫可達(dá)40℃以上 世界今日?qǐng)?bào)
- 當(dāng)前訊息:網(wǎng)貸被起訴了怎么辦?網(wǎng)貸逾期了怎么協(xié)商延期還款
- 當(dāng)前關(guān)注:廣東汕頭:搶占數(shù)字經(jīng)濟(jì)賽道 發(fā)展前景可期
- 《EffectiveC++》讀書筆記(2):構(gòu)造/析構(gòu)/賦值運(yùn)算_全球要聞
- 全球滾動(dòng):每日信息:興業(yè)銀行:減費(fèi)讓利出實(shí)招 惠企利民
- 中信銀行攜手抖音京東促消費(fèi) 推出618支付立減省錢購(gòu)
- 性價(jià)比神卡!盈通RX 6600顯卡降至1399元:8GB顯存-全球信息
- 快訊:天天熱頭條丨2022虎年紀(jì)念幣價(jià)格_2022虎年普通紀(jì)念幣開始預(yù)約
- 上海2023年一季度網(wǎng)約車數(shù)據(jù)公布,滴滴美團(tuán)占據(jù)8成市場(chǎng)份額!
- 數(shù)讀中國(guó) | 中非經(jīng)貿(mào)合作再上新臺(tái)階
- 俄烏戰(zhàn)爭(zhēng)如何改變俄國(guó)打工人——產(chǎn)業(yè)工人篇 世界看點(diǎn)
- 今日熱訊:多家公司披露半年報(bào)業(yè)績(jī)預(yù)告 悅心健康預(yù)計(jì)上半年業(yè)績(jī)大幅扭虧
- 當(dāng)前視點(diǎn)!麥?zhǔn)者M(jìn)度已過九成!穩(wěn)產(chǎn)保豐,小麥主產(chǎn)區(qū)有這些舉措
- 今日最新!焦點(diǎn)日?qǐng)?bào):網(wǎng)貸延期找法務(wù)能延期嗎?網(wǎng)貸延期收費(fèi)嗎合法嗎?
- 男子被判“禁酒三年”?柳城法院回應(yīng):違禁撤銷緩刑 每日聚焦
- A股三大指數(shù)集體收漲:深證成指七連陽(yáng) 北向資金凈買入超百億元
- 今日開啟!鄭州中原區(qū)發(fā)放400萬消費(fèi)券
- 環(huán)球信息:《遺跡的聲音》:把看不見、聽得著的口述故事變成電影
- 天優(yōu)科技總經(jīng)理賀曉龍辭職 張軍接任 2022年公司虧損351.22萬
- 當(dāng)前熱點(diǎn)-土豆和紅薯去皮后怎樣保存
- 信用卡逾期后怎么做比較好?辦信用卡個(gè)性化分期影響征信嗎?
- 天天看熱訊:韓國(guó)汽車追尾事故共致82人受傷 其中3人重傷
- 2023年車身裝飾上市公司有哪些?(6月16日) 焦點(diǎn)快看
- 奇瑞商用車&高科石化戰(zhàn)略合作授牌暨交車儀式圓滿舉行
- 警民接力物歸原主
- 環(huán)球即時(shí)看!長(zhǎng)光衛(wèi)星送41顆衛(wèi)星上天刷新紀(jì)錄 利好礦產(chǎn)開發(fā)、智慧城市建設(shè)等多個(gè)行業(yè)
- 申萬宏源宏觀周報(bào) · 第213期:下一輪“中性降息”的時(shí)間窗口
- 花甲死了但是全部開口了可以吃嗎
- 打造優(yōu)質(zhì)工程!??谑谢A(chǔ)設(shè)施類觀摩會(huì)在江東新區(qū)舉辦-環(huán)球關(guān)注
- 要想股長(zhǎng)久.千里共cpo 速訊
- 商務(wù)部:兩個(gè)原因致全國(guó)實(shí)際使用外資以美元計(jì)下降 原因
- 京津城際列車擴(kuò)容 “軌道上的京津冀”再升級(jí)-環(huán)球時(shí)訊
- 好幾年前出租過一次q號(hào),但沒有收錢也沒有成功詐騙到,直接被凍結(jié)了 全球球精選
- 天天信息:野生植物蘇鐵終于“回家”啦 天天看熱訊
- 當(dāng)前速看:網(wǎng)貸能辦理個(gè)性化分期嗎?網(wǎng)貸還不上怎么協(xié)商延期?
- 浙江金華召開打造“全民安心醫(yī)保城市”金名片新聞發(fā)布會(huì)|每日?qǐng)?bào)道
- 鮑春來被打過奧運(yùn)會(huì)嗎_鮑春來被打
- 羅湖Young|東門煥新升級(jí)!首發(fā)空間啟幕,一起玩出新高度
- 《遺跡的聲音》:把看不見、聽得著的口述故事變成電影
- 報(bào)告:超八成畢業(yè)生希望租金占工資30%以下
- 上交所:杭州熱電近期嚴(yán)重異常波動(dòng) 依規(guī)從嚴(yán)對(duì)相關(guān)投資者采取監(jiān)管措施-世界快訊
- 惠理集團(tuán)(00806)5月末資產(chǎn)總值59億美元_環(huán)球報(bào)資訊
- 拼多多贏麻了!Temu上半年GMV逼近30億美元,挑戰(zhàn)亞馬遜不是夢(mèng)?
- 國(guó)防部:加方在涉華問題上應(yīng)謹(jǐn)言慎行
- 人民財(cái)評(píng):構(gòu)建職業(yè)教育與產(chǎn)業(yè)發(fā)展相融互促的良好格局|動(dòng)態(tài)焦點(diǎn)
- 又見外資狂買百億,A股現(xiàn)十年僅三次現(xiàn)象!
- 深圳到上海機(jī)票圖片 真實(shí)_深圳到上海機(jī)票
- 速訊:網(wǎng)貸逾期遇到催收電話可以不接嗎?網(wǎng)貸逾期了暫時(shí)還不上怎么辦
- 【快播報(bào)】歌曲風(fēng)的季節(jié)是哪個(gè)電影的插曲 經(jīng)典歌曲風(fēng)的季節(jié)原唱是誰
- 今日精選:華寶新能(301327.SZ)向111名激勵(lì)對(duì)象授予270.58萬股限制性股票
- 解碼文化自信的城市樣本|“文樞”煥新耀金陵——解碼古都南京的文化自信樣本
- 當(dāng)前觀點(diǎn):北京市2023年普通高等學(xué)校招生志愿填報(bào)須知
- TFBOYS演唱會(huì)引爆市場(chǎng):黃牛代搶加價(jià)4500元,粉絲提前搶空周邊酒店
- 全球觀速訊丨去寧波帶什么禮物好_去寧波帶什么禮物好
- 環(huán)球焦點(diǎn)!投資提醒:6月16日1只新股可申購(gòu)
- 環(huán)球快訊:吃喝板塊異動(dòng),啤酒、白酒強(qiáng)勢(shì)飆升,食品ETF(515710)勁漲超3%
- 數(shù)學(xué)課題_數(shù)學(xué)課_天天看熱訊
- 珠海一季度游客增長(zhǎng)218.2% 四張?zhí)厣浦ξ捏w旅復(fù)蘇_時(shí)訊
- 【世界熱聞】鄧州市水務(wù)集團(tuán)自來水公司:多措并舉確保夏季汛期供水安全
- 全球訊息:曝阿萊格里會(huì)繼續(xù)留在尤文,從未考慮過其他球隊(duì)
- 安杰思(688581)6月16日主力資金凈買入114.08萬元 快看點(diǎn)
- 澎湃:央視恢復(fù)國(guó)足轉(zhuǎn)播,是中國(guó)足球關(guān)注度提升的積極信號(hào)
- 文化和旅游部副部長(zhǎng)會(huì)見伊朗文化和伊斯蘭指導(dǎo)部副部長(zhǎng)|天天要聞
- 全球觀焦點(diǎn):第二十一屆海峽青年論壇在廈門舉辦
- 全球觀天下!央行等五部門:加大貨幣政策工具支持力度 全面推進(jìn)鄉(xiāng)村振興
- 新消息丨13宗!774畝!今年市區(qū)第二批擬出讓地塊清單發(fā)布!
- 無主之地2金鑰匙怎么獲得?無主之地2存檔修改器使用方法是什么?_每日觀點(diǎn)
- 菲林格爾: 董事由股東大會(huì)選舉產(chǎn)生,董事會(huì)對(duì)股東大會(huì)負(fù)責(zé),總裁由董事會(huì)聘任、對(duì)董事會(huì)負(fù)責(zé)-每日視訊
- 恒生指數(shù)、恒生科技指數(shù)周線三連漲 恒生科技指數(shù)本周漲超7.5%-焦點(diǎn)關(guān)注
- 國(guó)足4-0大勝不足喜,橫掃墊底隊(duì)靠主場(chǎng)哨,足協(xié)花錢請(qǐng)緬甸演戲
- 環(huán)球即時(shí)看![路演]大全能源:公司的銷售策略仍是滿產(chǎn)滿銷
- 股票出現(xiàn)溢價(jià)成交是什么意思 股票溢價(jià)成交是利空還是利好
- 今天小麥的價(jià)格是多少(2023小麥最新價(jià)格)-全球簡(jiǎn)訊
- 【環(huán)球熱聞】鄧超攜妻兒看女兒演出!孫儷拎萬元包,兒子身高猛長(zhǎng)
- 廣期所:關(guān)于加強(qiáng)2023年端午節(jié)休市期間風(fēng)險(xiǎn)管理的通知_熱文
- 危險(xiǎn)!孩子玩氫氣球爆炸,媽媽大面積燒傷
- 一季度普陀區(qū)固定資產(chǎn)投資實(shí)現(xiàn)開門紅
- 世界觀察:“天府菜油”采風(fēng)看名堂⑤丨川內(nèi)油脂頭部企業(yè):“原料為王”
- 實(shí)時(shí)焦點(diǎn):郭瑞民赴黔南州福泉市開展主題教育領(lǐng)題調(diào)研
- 最新:一二級(jí)市場(chǎng)估值倒掛:生物產(chǎn)業(yè)投資嬗變 政產(chǎn)金共同賦能
- 【全球獨(dú)家】氣體分離設(shè)備概念的上市公司有哪些?(2023/6/16)
- 環(huán)球快看點(diǎn)丨山東鄒平市人大常委會(huì)機(jī)關(guān)二級(jí)調(diào)研員張寶武接受審查調(diào)查
- 外媒:英特爾將從德國(guó)政府獲得近110億美元的補(bǔ)貼
- 每日消息!房貸還不上怎么跟銀行協(xié)商?房貸如何辦理延期還款?|最新資訊
- 環(huán)球速遞!成都這家景區(qū),全員免費(fèi)!
- 圣諾醫(yī)藥-B(02257)6月16日斥資170.41萬港元回購(gòu)3.5萬股 全球快播報(bào)
- 內(nèi)蒙古鄂爾多斯市在少年軍校開展國(guó)防教育剪影
- 【成交分析】6月16日豆粕主力合約M2309成交128.96萬手
- qq飛車領(lǐng)永久車(qq飛車刷永久車)_全球熱文
- 因焊接工藝問題 保時(shí)捷召回911系列汽車
- 城市人群戰(zhàn)爭(zhēng)好玩嗎 城市人群戰(zhàn)爭(zhēng)玩法簡(jiǎn)介
- 【天天報(bào)資訊】新華全媒+|抓好關(guān)鍵期 各方助力高校畢業(yè)生就業(yè)