在學(xué)習(xí)這一章內(nèi)容前我們已經(jīng)學(xué)習(xí)過了類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的相關(guān)知識(shí),對(duì)于普通類型的對(duì)象來說,他們之間的復(fù)制是很簡(jiǎn)單的,例如: int a = 10; int b =a; 自己定義的類的對(duì)象同樣是對(duì)象,誰也不能阻止我們用以下的方式進(jìn)行復(fù)制,例如: #include <iostream> using namespace std; class Test { public: Test(int temp) { p1=temp; } protected: int p1; }; void main() { Test a(99); Test b=a; } 普通對(duì)象和類對(duì)象同為對(duì)象,他們之間的特性有相似之處也有不同之處,類對(duì)象內(nèi)部存在成員變量,而普通對(duì)象是沒有的,當(dāng)同樣的復(fù)制方法發(fā)生在不同的對(duì)象上的時(shí)候,那么系統(tǒng)對(duì)他們進(jìn)行的操作也是不一樣的,就類對(duì)象而言,相同類型的類對(duì)象是通過拷貝構(gòu)造函數(shù)來完成整個(gè)復(fù)制過程的,在上面的代碼中,我們并沒有看到拷貝構(gòu)造函數(shù),同樣完成了復(fù)制工作,這又是為什么呢?因?yàn)楫?dāng)一個(gè)類沒有自定義的拷貝構(gòu)造函數(shù)的時(shí)候系統(tǒng)會(huì)自動(dòng)提供一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù),來完成復(fù)制工作。
下面,我們?yōu)榱苏f明情況,就普通情況而言(以上面的代碼為例),我們來自己定義一個(gè)與系統(tǒng)默認(rèn)拷貝構(gòu)造函數(shù)一樣的拷貝構(gòu)造函數(shù),看看它的內(nèi)部是如何工作的!
代碼如下: #include <iostream> using namespace std; class Test { public: Test(int temp) { p1=temp; } Test(Test &c_t)//這里就是自定義的拷貝構(gòu)造函數(shù) { cout<<"進(jìn)入copy構(gòu)造函數(shù)"<<endl; p1=c_t.p1;//這句如果去掉就不能完成復(fù)制工作了,此句復(fù)制過程的核心語句 } public: int p1; }; void main() { Test a(99); Test b=a; cout<<b.p1; cin.get(); } 上面代碼中的Test(Test &c_t)就是我們自定義的拷貝構(gòu)造函數(shù),拷貝構(gòu)造函數(shù)的名稱必須與類名稱一致,函數(shù)的形式參數(shù)是本類型的一個(gè)引用變量,且必須是引用。
當(dāng)用一個(gè)已經(jīng)初始化過了的自定義類類型對(duì)象去初始化另一個(gè)新構(gòu)造的對(duì)象的時(shí)候,拷貝構(gòu)造函數(shù)就會(huì)被自動(dòng)調(diào)用,如果你沒有自定義拷貝構(gòu)造函數(shù)的時(shí)候系統(tǒng)將會(huì)提供給一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù)來完成這個(gè)過程,上面代碼的復(fù)制核心語句就是通過Test(Test &c_t)拷貝構(gòu)造函數(shù)內(nèi)的p1=c_t.p1;語句完成的。如果取掉這句代碼,那么b對(duì)象的p1屬性將得到一個(gè)未知的隨機(jī)值;
|