物件複製和物件賦值的區別

2021-08-15 21:32:23 字數 1716 閱讀 8018

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已經定義,所以此處呼叫賦值操作符過載函式。如果沒有編譯器會自動生成乙個。

物件複製和物件賦值

1 先看這個例子 include include using namespace std class student 建構函式 student string strname,int nage name strname age nage 帶引數的建構函式 student void show int m...

物件的賦值和複製

物件之間可以通過賦值運算子 進行賦值運算,通過以下的程式可以看出。include using namespace std class box box box int h,int w int len int box volume int main 說明 物件的賦值只對其中的資料成員進行賦值,而不對成員...

列表的賦值 淺複製和物件複製引用區別

一 物件的直接賦值 a 1 4,5 b b a print a b print id a print id b 這種賦值是內容和位址的完全相同的,a和b在內容和記憶體位址上是等價的。修改任意乙個列表,a或者b,兩者同時改變。true 1905039397384 1905039397384二 淺複製 ...