設計良好之物件導向系統會將物件的內部封裝起來,只留兩個函式負責物件拷貝(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...