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