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