複製建構函式VS賦值操作符過載

2021-10-11 07:59:02 字數 1538 閱讀 6015

複製建構函式,又稱拷貝建構函式。

是一種特殊的建構函式,它在建立物件時,是使用同一類中之前建立的物件來初始化新建立的物件。拷貝建構函式通常用於:

如果在類中沒有定義拷貝建構函式,編譯器會自行定義乙個。如果類帶有指標變數,並有動態記憶體分配,則它必須有乙個拷貝建構函式。拷貝建構函式的最常見形式如下:

classname (

const classname &obj)

a&

operator=(

const a& obj)

語句「classa obj2; obj2 = obj1;「 和語句「classa obj2 = obj1;」在呼叫函式上是有區別的:前者第一句是物件obj2的宣告及定義,呼叫類classa的無參建構函式,所以「obj2 =

obj1;」一句是在物件obj2已經存在的情況下,用obj1來為obj2賦值,呼叫的是賦值運算子過載函式;而後者,是用obj1來初始化obj2,呼叫的是拷貝建構函式。關於拷貝建構函式的語句樣式為「classa(const classa& cls)」

所以:

a obj1;

a obj2;

obj2 = obj1;

//呼叫賦值操作符過載函式

//而a obj3 = obj1;

//呼叫複製建構函式,

//相當於 a obj3(obj1);

測試環境:vs2013

class

student

~student()

//複製建構函式

student

(const student& s)

//賦值操作符過載

student&

operator

=(student& s)};

student fun1

(student s)

intmain

(void

)//結果如下:

建構函式 main:s1 0x004ff97f

建構函式 main:s2 0x004ff973

複製建構函式 fun1按值傳參s1 0x004ff868

建構函式 fun1中的s2 0x004ff83b

複製建構函式 fun1返回物件 0x004ff89b

析構函式 ~

0x004ff83b 析構fun1中的s2物件

析構函式 ~

0x004ff868 析構fun1按值傳參的s1物件

賦值操作符過載

析構函式 ~

0x004ff89b 賦值後析構fun1返回的臨時物件

析構函式 ~

0x004ff973 析構main中的s1物件

析構函式 ~

0x004ff97f 析構main中的s2物件

C 複製建構函式與過載賦值操作符

c 拷貝建構函式 深拷貝,淺拷貝 c 中複製建構函式與過載賦值操作符總結 深拷貝和淺拷貝的區別 對深拷貝與淺拷貝的再次理解 禁止使用類的copy建構函式和賦值操作符 拷貝建構函式中的陷阱 在c 中建立乙個類,這個類中肯定會包括建構函式 析構函式 複製建構函式和過載賦值操作。複製建構函式是一種特殊的建...

複製建構函式與賦值操作符

乙個類裡是否需要複製建構函式?有時候答案是 是 如果你的類在建構函式裡分配了資源,則可能需要乙個顯式的複製建構函式來管理資源。有析構函式的類通常用析構函式來釋放建構函式分配的資源,這通常也說明需要乙個複製建構函式。如果需要複製建構函式,則多半需要乙個賦值操作符。類x的賦值由x operator 來定...

轉換建構函式 複製建構函式 操作符過載

用轉換建構函式可以將乙個指定型別的資料轉換為類的物件 但是不能反過來將乙個類的物件轉換為乙個其他型別的資料 例如將乙個complex類物件轉換成double型別資料 c 提供型別轉換函式 type conversion function 來解決這個問題 型別轉換函式的作用是將乙個類的物件轉換成另一型...