條款28 避免返回handles 指向物件內部成分

2021-10-01 21:12:07 字數 1372 閱讀 6004

reference、指標、迭代器系統都是所謂的handles(號碼牌,用來獲得某個物件)。函式返回乙個handle,隨之而來的便是「減低物件封裝性」的風險。它也可能導致:雖呼叫const成員函式卻造成物件狀態被更改的風險。

class

point

;struct rectdata

;class

rectangle

point&

lowerright()

const..

.private

: std::tr1::shared_ptrpdata;

};

上述**便是自相矛盾的乙個例子。point 類是乙個代表點的類,rectdata代表乙個矩形的結構,rectangle類則代表乙個矩形,該類能夠返回表示矩陣的左上和右下的兩個點。由於這兩個函式為const的,因此所要表達的意思就是,返回矩陣的兩個點,但是不能修改他們。但是又又於返回的是點的reference形式,因此通過reference,實際是可以改變返回的點的資料的。因此,造成了自相矛盾。問題的原因就是,函式返回了handle。

(1)上述**的改進版本:在返回handles 的成員函式前加const。這便解決了自相矛盾問題。

class

rectangle

const point&

lowerright()

const..

.private

: std::tr1::shared_ptrpdata;

};

例如,某個函式返回gui物件的外框,是乙個矩形形式

class

guiobject

;const rectangle boundingbox

(constguiobject&obj)

;//現在,客戶可能這麼使用。

guiobject *pgo;

const point *pupperleft=&(

boundingbox

(*pgo)

.upperleft()

);

boundingbox 函式傳入乙個gui物件,它返回乙個gui的外框,即是乙個矩形,然後獲取這個去腥的右下方的點,並使用乙個指標指向它。而函式的返回值是乙個臨時的物件,即這個矩形是乙個臨時的物件,當這個語句執行結束後,矩形物件被銷毀,因此其內部的點也被銷毀,而此時pupperleft指向了乙個被銷毀的點。就形成了所謂的虛吊。

無論返回的handle是指標、reference、或者迭代器,也無論他是否為const。只要乙個handle被傳出去了,都是比較危險的。

有時候必須返回handle,例如operator,operator=。然而著只是少數的例外。

條款29 避免返回內部資料的控制代碼

假設b是乙個const string物件 class string const string b hello world b是乙個const物件 看看下面的情形 char str b 呼叫b.operator char strcpy str,hi mom 修改str指向的值 b的值現在還是 hell...

條款 33 避免繼承而來的名稱

避免繼承而來的名稱 一朵玫瑰叫任何名字還是一樣芬芳 莎士比亞 子類中查詢乙個成員的的名字的方法 1子類作用域 2 基類作用域 3 內含基類的名字空間 4 全域性 includeclass base void mf3 double class derived public base void mf3 ...

條款39 避免 向下轉換 繼承層次

基類指標不能呼叫派生類的獨有的成員,即使基類指標指向派生類物件,因為編譯器是根據指標的靜態型別來確定呼叫物件在記憶體中佔據的空間的。此時可以使用static cast來轉換,但不要這麼做,因為向下轉換難看 容易導致錯誤,而且使得 難於理解 公升級和維護,static cast不會進行型別檢查,即使指...