亚洲精品无码乱码成人|最近中文字幕免费大全|日韩欧美卡一卡二卡新区|熟妇性饥渴一区二区三区|久久久久无码精品国产AV|欧美日韩国产va在线观看|久久精品一本到99热动态图|99国产精品欧美一区二区三区

您現(xiàn)在的位置是: 產(chǎn)經(jīng) > > 正文

《EffectiveC++》讀書筆記(2):構(gòu)造/析構(gòu)/賦值運(yùn)算_全球要聞

時(shí)間:2023-06-17 10:08:21 來源:面包芯語(yǔ) 發(fā)布者:DN032

點(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)簽:

搶先讀

相關(guān)文章

熱文推薦

精彩放送

關(guān)于我們| 聯(lián)系我們| 投稿合作| 法律聲明| 廣告投放

版權(quán)所有© 2011-2023  產(chǎn)業(yè)研究網(wǎng)  www.www-332159.com

所載文章、數(shù)據(jù)僅供參考.本站不作任何非法律允許范圍內(nèi)服務(wù)!

聯(lián)系我們:39 60 29 14 2 @qq.com

皖I(lǐng)CP備2022009963號(hào)-13