Effective C++ 第二十八條 Avoid returning “handles” to object internal

避免返回 handles 指向?qū)ο髢?nèi)部成分
下面有一段代碼
我們?cè)谥暗膶W(xué)習(xí)中知道,以 by-reference 的方式傳遞用戶自定義類型效率總是比 by-value 高,所以這里函數(shù) value 采用 by- reference 的方式傳遞。但是也會(huì)導(dǎo)致一些問題。
我們?cè)诤瘮?shù)外部獲取了屬于 private 的 reference ,然后對(duì)其進(jìn)行修改,這樣我們就破壞了 test 的封裝性。所以為了避免封裝性降低,我們不能讓返回一個(gè) non-const 的 reference。
就算是這樣,也有可能導(dǎo)致其他錯(cuò)誤。
當(dāng)我們采用 by-value 的方式返回一個(gè) test 的時(shí)候,返回的結(jié)果是一個(gè)臨時(shí)變量 temp,在函數(shù) getATest 結(jié)束的時(shí)候,temp 就已經(jīng)被銷毀,但是 ptr 指向 temp.value(),指向一個(gè)被銷毀的臨時(shí)變量,也就會(huì)導(dǎo)致錯(cuò)誤。所以即使是返回 private 成員的 const reference ?也依舊會(huì)導(dǎo)致錯(cuò)誤。這種情況稱為 虛吊(dangling handles)。
handles 包括引用、指針和迭代器。在寫一個(gè)類的時(shí)候,盡量不要返回指向內(nèi)部部分的 handles,內(nèi)部成分不僅包括 private/protected 修飾的成員變量還有成員函數(shù)。但這不是絕對(duì),有時(shí)候難以避免。比如 string 的 operator [],對(duì)于這種難以避免返回指向內(nèi)部的 handles。
總結(jié):
避免返回指向內(nèi)部成分的 handles,遵守這一點(diǎn)即可增強(qiáng)封裝性,幫助 const 成員函數(shù)的行為像一個(gè) const,并將發(fā)生 “dangling handles” 的可能性降低。