復(fù)制構(gòu)造函數(shù)是構(gòu)造函數(shù)的一種,也被稱為拷貝構(gòu)造函數(shù),他只有一個參數(shù),參數(shù)類型是本類的引用。默認(rèn)構(gòu)造函數(shù)(即無參構(gòu)造函數(shù))不一定存在,但是復(fù)制構(gòu)造函數(shù)總會存在。因為只要沒有自己寫的復(fù)制構(gòu)造函數(shù),就會自動生成一個復(fù)制構(gòu)造函數(shù),它只是實現(xiàn)了對應(yīng)成員之間的一一對應(yīng)的復(fù)制。大多數(shù)時候這樣一個自動生成的復(fù)制構(gòu)造函數(shù)是夠用的,但是當(dāng)涉及到“深拷貝”的需求時還是要自己設(shè)計復(fù)制構(gòu)造函數(shù)。
構(gòu)造函數(shù)不能以本類的對象作為唯一參數(shù),以免和復(fù)制構(gòu)造函數(shù)相混淆。舉例子來說就是, CNum(CNum n){}; 這樣的構(gòu)造函數(shù)是不允許的。
為什么C++要有這樣的機(jī)制來保證復(fù)制構(gòu)造函數(shù)一定存在呢,因為在很多種情況下都會需要這樣的構(gòu)造函數(shù)。
1)當(dāng)用一個對象去初始化同類的另一個對象時,會調(diào)用復(fù)制構(gòu)造函數(shù)。
對基本數(shù)據(jù)類型有這樣的用法:
1 int a = 2;2 int b = a;
第二個語句中使用一個int變量初始化了另一個int變量。對象也可以有類似的初始化方法,用一個對象去初始化另一個同類對象。
1 CNum n1 = 1;2 CNum n2 = n1; //調(diào)用復(fù)制構(gòu)造函數(shù)
注意,第二個語句是一條初始化語句,調(diào)用了復(fù)制構(gòu)造函數(shù)。如果分開寫成CNum n2; n2 = n1;就不會調(diào)用復(fù)制構(gòu)造函數(shù)而是調(diào)用無參構(gòu)造函數(shù),然后調(diào)用對=運算符的重載函數(shù)。