Effective C 條款11 不止於此

2021-10-25 17:52:02 字數 1129 閱讀 4258

「 自我賦值 」 發生在物件被賦值給自己時:

class

getself

;getself w;..

.w = w;

// 賦值給自己

// 看起來似乎有些愚蠢,但不乏有人這樣做

還有一些潛在不容易看出來的自我賦值:

a [ i ]

= a [ j ]

;// 潛在的自我賦值

// 如果 i = j,那麼便是自我賦值

再看:

*ptr =

*qtr;

// 潛在的自我賦值

// 如果 ptr 和 qtr 都指向同乙個東西,那這就是自我賦值

假設建立乙個 class 用來儲存乙個指標指向一塊動態分布的點陣圖(bitmap):

class

bitmap

;class

getself

;

下面來看一段 operator= 的實現**:

getself& getself::

operator=(

const getself& r)

分析:

這裡的 「 自我賦值 」 問題是,operator= 函式體內的 *this (賦值的目的端)和 r 有可能是同一物件。如果真是如此那就太糟糕了,因為這樣的話 delete 掉的就不只是當前物件的 bitmap,它也銷毀了 r 的bitmap。在函式末尾,getself ——他原本不該被自我賦值動作改變的——發現自己持有乙個指標指向乙個被刪除了的物件!

為了阻止這樣的錯誤,可以採用 「 證同測試(identity test)」 達到 「 自我賦值 」 的檢驗目的:

getself& getself::

operator=(

const getself& r)

;getself& getself::

operator=(

const getself& r)

最後請記住:

確定任何函式如果操作乙個或以上的物件,而其中多個物件是同乙個物件時,其行為仍然正確。

Effective C 筆記 條款11

為什麼會出現自我賦值呢?不明顯的自我賦值,是 別名 帶來的結果 所謂 別名 就是 有乙個以上的方法指涉物件 一般而言如果某段 操作pointers或references而它們被用來 指向多個相同型別的物件 就需要考慮這些物件是否為同乙個。實際上兩個物件來自同乙個繼承體系,它們甚至不需要宣告為相同型別...

effective c 條款11學習總結

1.為需要動態分配記憶體的類宣告乙個拷貝建構函式和乙個賦值操作符 只要類裡有指標時,就要寫自己版本的拷貝建構函式和賦值操作符函式。在這些函式裡,你可以拷貝那些被指向的資料結構,從而使每個物件 都有自己的拷貝 或者你可以採用某種引用計數機制去跟蹤當前有多少個物件指向某個資料結構。引用計數的方法更複雜,...

Effective C 經驗條款

高效c 4 必須返回物件時,別妄想返回其reference 這句話什麼意思呢?就是在乙個函式內,如果你需要這個函式返回乙個新的物件,那麼這個函式的返回值型別就不要定義成引用型別。就直接返回這個類型別。首先,我們知道在函式傳遞引數時,傳遞引用的好處,尤其是對那麼比較大的型別,但是對於內建型別和stl的...