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