原則28:避免返回handles指向?qū)ο蟮膬?nèi)部成分

在這里首先要明確啥是handles,這里所說的handles就是通常所說的引用、指針或者迭代器等具有指代性質(zhì)的標簽。那么題目所說的意思就是你返回的那個handles不要涉及對象內(nèi)部的東西。
在敘述此原則的過程中作者舉了一個矩形Rectangular的例子,說舉行的四個頂點存儲在一個結(jié)構(gòu)體中,Rectangular提供了兩個公有接口upperleft和lowerright它們返回的是該矩形左上角和右下角的頂點的坐標結(jié)構(gòu)體,并且是以引用的形式返回的。因為用戶只需知道這些頂點的坐標而無需對這些頂點進行操作,因此這倆接口都是常函數(shù)。但是矛盾出現(xiàn)了,常函數(shù)的作用是不允許用戶去修改,但是這兩個常函數(shù)卻返回了Rectangular的私有成員。另外常函數(shù)只是說在常函數(shù)體內(nèi)不進行更改數(shù)據(jù)成員的操作,它返回的東西并不一定是常量。既然如此用戶就很有可能通過這倆接口去改變Rectangular類原本私有成員,這是極其不符合該程序的初衷和封裝性原則的。
所以作者在這里說“成員變量的封裝性最多等于其返回引用的訪問級別”是很有道理的。作者還說非公有的成員函數(shù)也是內(nèi)部數(shù)據(jù),這不是廢話嘛,我早就知道啊。作者想表達是啥呢,就是從訪問級別上來講,不要讓那些訪問級別高的成員函數(shù)返回指向訪問級別低的成員函數(shù)的handles,不過在我看來,具體來講就是不要讓公有接口返回任何非公有的成員的handles。
那么這原則中所提及的問題是怎么解決的呢?正如我所說的,常函數(shù)只是在函數(shù)體內(nèi)不能對數(shù)據(jù)成員更改,但是它返回的東西并不一定不能被更改,所以呢,那么就把返回值也設成const就OK了。
盡管如此呢還是有個問題存在,那就是函數(shù)雖然返回了const成員不能被更改,但是作為右值的語句結(jié)束以后,它的生命期就結(jié)束了,那右值的東西被析構(gòu)掉左值不就成了空吊子。
所以返回只想對象內(nèi)部成分的handles總是危險的,
作者最后總結(jié)道:能不用handles只想對象內(nèi)部就不用,這樣可以增加封裝性,最好在const函數(shù)的返回類型上也加個const,也盡量避免空吊的出現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容