條款21:當必須返回物件時,別妄想返回其reference
並不是在任何情況下都可以通過傳引用的方式返回值。看下面這段**
const rational& operator* (const rational& r1, const rational& r2)
事實上,任何對這個函式返回值的讀寫操作都將返回錯誤,因為返回的物件是函式棧內的物件,在函式結束之後物件就已經銷毀了。使用已經銷毀的物件會導致錯誤!
接下來看看在堆上分配
const rational& operator* (const rational& r1, const rational& r2)
這次呼叫函式能準確無誤的返回運算結果了。但是這仍然是有問題的**。這次的問題是記憶體洩漏,因為沒人保證會在呼叫*運算子之後再把產生的物件刪除掉,就算是每次都會小心的把運算結果物件給delete掉,但是在進行a = b*c*d;這種運算的時候,會進行兩次new操作,我們很難刪除那個隱藏的物件。
所以說絕對不要返回pointer或reference指向乙個local stack物件,指向乙個heap-allocated物件也不是好方法,更不能指向乙個local static物件(陣列),該讓編譯器複製物件的時候,就讓它去複製!
《Effective C艹》讀書筆記(1)
條款01 把c 當作乙個語言聯邦 c 不是簡單的 新增了物件導向特性的c語言 我們可以認為c 是由以下四個次語言組成的語言。2,物件導向c 這一部分包含了 封裝,繼承,多型,等等物件導向程式設計語言最直觀的特徵。3,template c 泛型程式設計。4,stl 是乙個template程式庫。包含有...
《Effective C艹》讀書筆記(12)
條款十八 讓介面容易被正確使用,不易被誤用 如果我們設計乙個日期類,可能會寫成如下的模樣 class date 這個建構函式貌似沒有問題,但是她卻無法阻止使用者輸入錯誤的資料。比如使用者可能會把date 3,30,2015 寫成date 30,3,2015 所以說其實當你設計的程式需要假定使用者都能...
《Effective C艹》讀書筆記(15)
條款22 將成員變數宣告為private 作為學生黨,經常在 裡把變數宣告為public,在外部直接進行訪問了事。這個條款告訴我們,這樣做是非常不科學的。1,private能夠提供非常完善的許可權控制,你可以直接控制乙個變數是唯讀,還是可讀可寫,甚至是只寫。而不是把使用這個類的各種許可權全部公開。2...