拷貝建構函式的形參應是類物件的引用,而不是物件的值

2021-05-22 01:20:43 字數 960 閱讀 5774

有乙個抽象類,如下:

class noname

noname(const noname &noname): pstring(new string(*noname.pstring)), i(noname.i), d(noname.d) {}

private:

string *pstring;

int i;

double d; };

拷貝建構函式也是建構函式,有乙個形參,是對本類型別物件的引用。拷貝建構函式有四個方面的作用:

1)利用已有物件顯式或隱式初始化乙個新物件;

2)複製乙個物件,將它作為實參傳給乙個函式;

3)從函式返回時複製乙個物件;

4)初始化順序容器中的元素

5)顯式初始化(利用陣列的初始化列表)陣列元素。

從拷貝建構函式的定義可以看出,這種建構函式的形參是對本類物件的引用。假設有下面的情況:

noname nn1;                // 定義乙個noname類型別的物件nn1,並隱式呼叫預設建構函式初始化這個物件

noname nn2(nn1);      // 將nn1物件的值拷貝給nn2

物件之間的賦值,會呼叫拷貝建構函式。如果拷貝建構函式的形參不是物件的引用,而是物件本身,在呼叫拷貝建構函式的時候會發生什麼?

如果拷貝建構函式的形參是物件本身,即定義noname(const noname nn),在呼叫它的時候,由於是值傳遞,主調函式(noname nn2(nn1); 會呼叫拷貝建構函式)會把實參的副本傳遞給形參。那麼實參的副本怎麼來的(實參是物件)?當然也是呼叫拷貝建構函式生成的。但是呼叫拷貝建構函式生成副本的過程中,又會呼叫拷貝建構函式,這樣,拷貝建構函式就會一直遞迴呼叫,直到耗盡棧空間程式崩潰。

因此,答案是:如果拷貝建構函式的形參是物件本身,它就會一直被遞迴呼叫,直到耗盡棧空間程式崩潰。

因此,拷貝建構函式的形參一定要是物件的引用,因為這樣才不會發生值傳遞。

C 類物件的拷貝建構函式

c 類物件的拷貝建構函式 不祥 閱讀人次 條 對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 100 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。include using namespace std cl...

C 類物件的複製 拷貝建構函式

在學習這一章內容前我們已經學習過了類的建構函式和析構函式的相關知識,對於普通型別的物件來說,他們之間的複製是很簡單的,例如 int a 10 int b a 自己定義的類的物件同樣是物件,誰也不能阻止我們用以下的方式進行複製,例如 include using namespace std class ...

C 類物件的複製 拷貝建構函式

在學習這一章內容前我們已經學習過了類的建構函式和析構函式的相關知識,對於普通型別的物件來說,他們之間的複製是很簡單的,例如 int a 10 int b a 自己定義的類的物件同樣是物件,誰也不能阻止我們用以下的方式進行複製,例如 include using namespace std class ...