對于C++類:顯示地寫出拷貝構(gòu)造函數(shù),重載賦值操作符和析構(gòu)函數(shù)是良好的習(xí)慣,但在寫構(gòu)造函數(shù)時需要注意一些容易的錯誤,如下面的代碼:
在下面三種情況下會調(diào)用拷貝構(gòu)造函數(shù):
(1)用一個已經(jīng)實例化了的該類對象,去實例化該類的另外一個對象;
(2)用該類的對象傳值的方式作為一個函數(shù)的參數(shù);
(3)一個函數(shù)返回值為該類的一個對象。
特別地,對于語句 M m; M mm=m; 屬于(1)情況,即語句M mm=m;調(diào)用的是拷貝構(gòu)造函數(shù),而不是構(gòu)造函數(shù)。
但在重載=操作符時,返回值不是引用類型將導(dǎo)致程序運行出現(xiàn)嚴(yán)重問題。即如果出現(xiàn)上面會調(diào)用拷貝構(gòu)造函數(shù)的三種情況之一,或者使用=操作符時,拷貝構(gòu)造函數(shù)和operator =將循環(huán)遞歸調(diào)用,導(dǎo)致程序出現(xiàn)死循環(huán)。原因是拷貝構(gòu)造函數(shù)和operator =之間不斷地重復(fù)調(diào)用。
解決辦法:將operator =的返回類型改為引用類型M&,此時調(diào)用operator =時不會去調(diào)用拷貝構(gòu)造函數(shù)。
還有,若要寫clone時,若通過下面的方式:
前提是拷貝構(gòu)造函數(shù)不能調(diào)用clone來完成拷貝,否則出現(xiàn)上面同樣的問題,下面的代碼就會出現(xiàn)這樣的問題
總之,在寫這些函數(shù)時,要特別留意彼此的調(diào)用關(guān)系。
以下是我的慣用寫法:
(A)對于拷貝構(gòu)造函數(shù)和重載=操作符
這里寫成了inline函數(shù),只是方便說明問題,其實不必非要這么寫,可以采取先聲明,后定義的常規(guī)方法。
(B)對于clone函數(shù)
聲明: virtual M clone(); //考慮繼承時的多態(tài)
定義:
Copyright @ r2100 Powered by: .Text and ASP.NET Theme by: .NET Monster