在這篇博文里面我打算寫兩個《Effective C++》中的原則,因為第一個原則太短了。
現(xiàn)在介紹第一個原則:條款10,此條款旨在說明在你自己編寫的賦值操作符=一定要返回該左值的引用。具體來說就是返回this。這很好解釋,因為this是指向本對象的指針,那么this就是該對象的本身實體了。而你現(xiàn)在返回的只不過是該實體的一個代表符號而已。現(xiàn)在一般的賦值操作符都采用這個原則,雖然不是強制的,但是大家都遵守。
下面來對條款11做一些介紹。
條款11的內(nèi)容很簡單,就是一定要妥善處理賦值操作符=的自我賦值問題,就是自己給自己賦值的情況。那么這又是為什么呢?因為在某些時候你要編寫用來管理資源的類,那你知道一個資源不用了就要釋放掉,以便留給下一個需要該資源的對象。不過,這是很合理的。但是,假設當前占用該資源的對恰好是用來賦值的右值,也就是它倆其實是一個東東。如果還是按照上面處理的話,就會出現(xiàn)被用來賦值的右值實際上已經(jīng)啥實質(zhì)內(nèi)容都沒有了,this指針指向了NULL,那就會發(fā)生錯誤。那么怎樣處理這種情況呢?
第一種方法很簡單,那就是在賦值操作符的實現(xiàn)中最先判斷一下賦值的對象和被賦值的對象是不是一個,即if(this==&obj)。不過這種方法不好,因為這需要額外寫出一條語句,這無疑會增加運行時間。
所以實際上采用的辦法就是所謂的COPY and SWAP方法。什么意思呢?首先賦值一份右值,生成一個COPY,然后用*this與這個COPY進行SWAP,那么就可以完美解決自我賦值的問題。因為既然是COPY那么原來那個右值就沒有改變,而this原本是空的,它和那個COPY交換以后,那個COPY就變成了NULL,而this的內(nèi)容就成了COPY,也就是原來的那個右值的值了。
還有一種方法就是直接利用賦值操作符重載函數(shù)的傳參機制是傳值這一特性,直接傳進來一個COPY。該方法可行,但是作者不提倡,它說這樣做的話清晰性變差了,我的這個清晰性大概就是可讀性吧。不過,我倒覺得沒啥。他又說這種方法有時候可能更高效。
原則10:令operator=返回一個reference to *this 原則11:在operator=中處理“自我賦值”
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內(nèi)容
- 進入2017年以來,隨著以比特幣為代表的加密數(shù)字貨幣的暴漲,作為新型數(shù)字加密貨幣主流的發(fā)行渠道,基于區(qū)塊鏈的...