設計良好的物件導向系統會將物件的內部封裝起來,只留兩個函式負責物件拷貝(複製),就是copy建構函式和賦值操作符,我們稱之為copying函式。前面我說了,編譯器會在必要時候為我們的類生成copying函式,並說明這些「編譯器生成版」的行為:將被拷貝物件的所有成員都拷貝乙份。
如果你宣告自己的copying函式,意思就是告訴編譯器你不喜歡預設實現中的某些行為。編譯器像是被冒犯似的,會以一種奇怪的方式回敬你:當你的實現**幾乎必然出錯時不告訴你。
考慮乙個類用來表現顧客,其中手工寫出copying函式,使得外界對它們的呼叫會被志記下來:
void logcall(const std :: string& funcname); //製造乙個log entry
class customer
;customer::customer(const customer& rhs):name(rhs.name)
customer& customer::operator=(const customer& rhs)
這裡每一件事看起來都很順利,實際也如此,直到令乙個成員變數加入:
class date; //日期
class customer
;
這時候已經有的copying函式執行的是區域性拷貝:它們的確複製了顧客的name,但沒有複製新新增的lasttransaction。大多數編譯器對此不會有報錯,結論就是:你既然自己寫了copying函式,就得自己負責,編譯器是不會管的了。
一旦發生了繼承,可能會造成乙個潛藏危機:
class prioritycustomer:public customer
prioritycustomer::prioritycustomer(const prioritycustomer& rhs):
priority(rhs.priority)
prioritycustomer& prioritycustomer::operator = (const prioritycustomer& rhs)
看起來該類的copying函式好想複製了每一樣東西,但再看一眼,我們忘了基類中的name和lasttransaction,所以要記得在copying函式上補上,我這裡就不過多贅述了。
當你編寫乙個copying函式,請確保1、複製所有local成員變數,2、呼叫基類內適當的copying函式。
總結:1、copying函式應該確保複製「物件內的所有成員變數「及「所有基類成分「;
2、不要嘗試以某個copying函式實現另乙個copying函式。應該將共同機能放進第三個函式中,並由兩個copying函式共同呼叫。
C 程式設計習慣
1 初始化列表,盡量使用。2 函式是否加const,只用而不改變就推薦加上const。如自定義的get某個屬性的函式。3 函式引數盡量用引用傳遞,返回值也優先考慮引用型別 引用必須保證在使用前,本體不能消失。所以返回值是區域性變數,就不可以用引用型別,出了大括號,本體就消亡了 函式引數如果只拿來使用...
c 複製物件
對於物件轉殖的所設計到知識點 對值型別字段只是簡單的拷貝乙個副本到目標物件,改變目標物件中值型別欄位的值不會反映到原始物件中,因為拷貝的是副本 對引用型字段則是指拷貝他的乙個引用到目標物件。改變目標物件中引用型別欄位的值它將反映到原始物件中,因為拷貝的是指向堆是上的乙個位址 原始物件中對應字段相同 ...
PHP寫時複製, 變數複製和物件複製不同
2016年3月18日 15 09 28 星期五 一直以為php物件也是寫時複製.其實 php的變數是寫時複製,物件是引用的 寫時複製 a b 如果 b的內容不改變,a和 b指向同一塊記憶體 如果 b內容改變了,a的內容是不會改變的,而是為 b重新申請空間存放資料 但是 物件 objtest1 obj...