複製建構函式跟賦值建構函式的區別

2021-07-05 13:22:08 字數 1867 閱讀 7254

1. 何時呼叫複製建構函式

複製建構函式用於將乙個物件複製到新建立的物件中。也就是說,它用於初始化過程中,而不是常規的賦值過程中。類的複製建構函式原型通常如下:

class_name(const class_name&);

它接受乙個指向類物件的常量引用作為引數。例如,string類的複製建構函式的原型如下:

string(const string&);

新建乙個物件並將其初始化為同類現有物件時,複製建構函式都將被呼叫。這在很多情況下都可能發生,最常見的情況是將新物件顯示地初始化為現有的物件。例如,假設motto是乙個string物件,則下面4種宣告都將呼叫複製建構函式:

string ditto(motto);

string metoo = motto;

string also = string(motto);

string *pstring = new string(motto);

其中中間的2種宣告可能會使用複製建構函式直接建立metto和also,也可能會使用複製建構函式生成乙個臨時物件,然後將臨時物件的內容賦給 metoo和also,這取決於具體的實現。最後一種宣告使用motto初始化乙個匿名物件,並將新物件的位址賦給pstring指標。

2. 何時呼叫賦值建構函式

賦值建構函式是通過過載賦值操作符實現的,這種操作符的原型如下:

class_name& class_name::operator=(const class_name&);

它接受並返回乙個指向類物件的引用。例如,string 類的賦值操作符的原型如下:

string& string::operator=(const string&);

將已有的物件賦給另乙個物件時,將使用過載的賦值操作符:

string headline1("test");

string knot;

knot = headline1;

初始化物件時,並不一定會使用賦值操作符:

string metoo = knot;

這裡,metoo是乙個新建立的物件,被初始化為knot的值,考試,大提示使用複製建構函式。不過,正如前面指出的,實現時也可能分兩步來處理這條語句:使用複製建構函式建立乙個臨時物件,然後通過賦值將臨時物件的值複製到新物件中。這就是說,初始化總是會呼叫複製建構函式,而使用=操作符時也可能呼叫賦值操作符

例項**如下:

#include using namespace std;

class test

;  test::test()

{  cout<<"呼叫建構函式"《輸出如下:

呼叫建構函式

呼叫複製建構函式

呼叫建構函式

呼叫賦值建構函式

呼叫析構函式

呼叫析構函式

呼叫析構函式

同樣是利用現有物件的值,生成/更新另乙個物件的值。區別在於:複製建構函式是去完成對未初始化的儲存區的初始化,而賦值操作符則是處理乙個已經存在的物件。對乙個物件賦值,當它一次出現時,它將呼叫複製建構函式,以後每次出現,都呼叫賦值操作符。

定義物件a,並用另乙個物件b對a進行初始化時,

若沒有複製建構函式時,那麼編譯器會自動生成乙個

t b(1);//假設物件b已經初始化

t a(b);//初試化階段,呼叫複製建構函式

t c = b;//雖然使用了「=」,但是初試化階段,仍呼叫複製建構函式

t c = a; //因為物件c已經定義,所以此處呼叫賦值操作符過載函式。如果沒有編譯器會自動生成乙個。

**:

C 賦值建構函式 複製建構函式

編譯器提供乙個不接受任何引數,也不執行任何操作的建構函式,稱之為預設建構函式 這是因為創造物件的時候總會呼叫預設建構函式 klunk klunk 定義 klunk lunk 宣告 使用預設建構函式 如果定義了建構函式,c 不會定義預設建構函式,如果希望建立物件時不顯示地對他進行初始化,則必須顯示的定...

預設建構函式 建構函式 複製建構函式和賦值操作符

這幾個概念比較容易混淆,總結一下。預設建構函式是沒有引數 和類同名的建構函式。當乙個類沒有任何建構函式時,編譯器將會合成乙個預設建構函式。那麼編譯器合成的預設建構函式是做什麼用的呢?是初始化類的成員變數嗎?事實上不是。編譯器合成的預設建構函式只是滿足編譯器的需要,而不是按照程式設計師想的去做。更詳細...

複製建構函式與賦值函式

建構函式 析構函式 賦值函式是每個類最基本的的函式。每個類只有乙個析構函式和乙個賦值函式。但是有很多建構函式 乙個為複製建構函式,其他為普通建構函式。對於乙個類a,如果不編寫上述四個函式,c 編譯器將自動為a產生四個預設的函式,即 既然能自動生成函式,為什麼還需要自定義?原因之一是 預設的複製建構函...