Effective C 條款12 不止於此

2021-10-25 18:35:42 字數 1581 閱讀 5820

設計良好之物件導向系統會將物件的內部封裝起來,只留兩個函式負責物件拷貝(copy 建構函式和 copy assignment 操作符)

在 c++ 中,如果自己宣告 copying 函式,會發生這樣一種情況:當你的實現**幾乎必然出錯時卻不告訴你。

看下面的**說事:

void

logcall

(const std::string& funcname)

;// 製造乙個 log entry

class

customer

;customer::

customer

(const customer& r)

:name

(r.name)

customer& customer::

operator=(

const customer& r)

這樣做看起來很好,實際也很好,但如果另乙個變數的加入就會打破這個美好的局面:

class

date

;// 日期

class

customer

這時候上面的 copying 函式執行的就是區域性構造:

複製了 name,但是沒有複製新新增的 lasttransaction。但大多數的編譯器都不會報錯。

一但發生繼承,將面臨這一主題最暗中肆虐的危機:

class

vipcustomer

:public customer

;vipcustomer::

customer

(const vipcustomer& r)

:vip

(r.vip)

vipcustomer& vipcustomer::

operator=(

const vipcustomer& r)

vipcustomer 的 copying 函式只是複製了 vipcustomer 宣告的成員變數,但是它還含有從 base class 繼承的成員變數附件(副本),但沒有被複製。因此 base class 的成員變數保持不變。

在為 derived class 撰寫 copying 函式時,都必須小心地也複製其 base class 的成分。那些成分往往是 private 的,所以應該讓 derived class 的 copying 函式呼叫相應的 base class 函式:

vipcustomer::

customer

(const vipcustomer& r)

:customer

(r);

// 呼叫 base class 的 copy 建構函式

vip(r.vip)

vipcustomer& vipcustomer::

operator=(

const vipcustomer& r)

上面只是簡單介紹,詳細內容會在條款22細說。

copy 建構函式和 copy assignment 操作符不能相互呼叫!

最後記住:

Effective C 經驗條款

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

effective c 條款總結

條款1 盡量用const 和inline 而不用 define 條款2 盡量用而不用 條款3 盡量用new delete 而不用malloc free 條款4 盡量使用c 風格注釋 條款5 對應的new和delete 都要採用相同的形式 條款6 析構函式裡對指標成員呼叫delete條款 條款7 預先...

Effective C 經驗條款

高效c 模板與泛型程式設計 在c 中模板體現的是編譯期多型,virtual體現的是執行期多型。關於typename的雙重含義 在宣告template引數時,不論使用keywordclass或typename,意義全然同樣。可是c 並不總是把class和typename視為等價。有時候必須使用type...