拷貝建構函式與賦值建構函式

2022-05-06 19:27:10 字數 1082 閱讀 5246

什麼時候用拷貝建構函式,和賦值建構函式:

(一)當用乙個已初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫。也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式:

乙個物件以值傳遞的方式傳入函式體

乙個物件以值傳遞的方式從函式返回

乙個物件需要通過另外乙個物件進行初始化。

如果在類中沒有顯式地宣告乙個拷貝建構函式,那麼,編譯器將會自動生成乙個預設的拷貝建構函式,該建構函式完成物件之間的位拷貝。位拷貝又稱淺拷貝,後面將進行說明。

自定義拷貝建構函式是一種良好的程式設計風格,它可以阻止編譯器形成預設的拷貝建構函式,提高原始碼效率。

例子:

string a("hello");

string b("world");

string c = a; // 呼叫了拷貝建構函式,最好寫成 c(a);

c = b; // 呼叫了賦值建構函式。!

本例中第三個語句的風格較差,宜改寫成string c(a) 以區別於第四個語句。

(二)拷貝建構函式是在物件被建立時呼叫的,而賦值函式只能被已經存在了的物件呼叫。

不同點:

拷貝建構函式首先是乙個建構函式,它呼叫的時候產生乙個物件,是通過引數傳進來的那個物件來初始化,產生的物件。 

operator=();是把乙個物件賦值給乙個原有的物件,所以如果原來的物件中有記憶體分配要先把記憶體釋放掉,而且還要檢查一下兩個物件是不是同乙個物件,如果是的話就不做任何操作。

還要注意的是拷貝建構函式是建構函式,不返回值;而賦值函式需要返回乙個物件自身的引用,以便賦值之後的操作。

所謂淺拷貝,指的是在物件複製時,只是對物件中的資料成員進行簡單的賦值,上面的例子都是屬於淺拷貝的情況,預設拷貝建構函式執行的也是淺拷貝。大多情況下「淺拷貝」已經能很好地工作了,但是一旦物件存在了動態成員,那麼淺拷貝就會出問題了

在「深拷貝」的情況下,對於物件中動態成員,就不能僅僅簡單地賦值了,而應該重新動態分配空間

拷貝建構函式與賦值建構函式

include stdafx.h include include using namespace std class a a a a 過載拷貝函式 a int id,char t name a char name a operator a a 注意 此處一定要返回物件的引用,否則返回後其值立即消失!...

建構函式 拷貝建構函式 賦值建構函式

class和struct很大乙個區別在於,c除了成員的訪問控制許可權,struct中的成員預設是public,而class中的field預設是private class還有乙個special的地方是它有建構函式 constructor。建構函式是class中的一員,和成員變數 其他成員函式一起構成乙...

建構函式 拷貝函式 賦值建構函式

ifndef sample h define sample h include include struct qq int qqnum std string qqpassword 以下a,b,c,d分別為 a 沒有實現拷貝建構函式和賦值建構函式,所以會自動生成預設的拷貝建構函式和賦值建構函式 b 與...