問題:現有類a定義如下:
class a
3./***************************************** test3*****************************************/
int main(int argc, char *argv)
對於test1輸出結果為:
constructor
解釋:語句 a obj = 2; 是物件obj的宣告和初始化,也就是構造物件obj。「=」在這裡表示的是初始化,不是賦值。由於 2 和 obj 型別不同,將發生隱式類型別轉換,呼叫 a(int a) 建構函式。
對於test2輸出結果為:
constructor
copy constructor
解釋:語句 a obj2 = obj1; 同樣也是物件的宣告和初始化,也就是構造物件obj2。「=」在這裡表示的是初始化,不是賦值。由於obj1和obj2型別一致,直接呼叫複製建構函式構造物件obj2。
對於test3輸出結果為:
constructor
constructor
operator=
解釋:語句 obj = 2; 由於物件obj已經宣告並初始化了,因此這裡的「=」表示的是賦值。又因為 2 和obj 型別不同,首先2隱式轉換為a型別的臨時物件,再呼叫賦值操作符函式對obj進行賦值。
備註:
1.「=」表示的是初始化還是賦值關鍵在於等號左邊物件是否已經存在(已經被構造)。如果不存在,則是初始化,應該呼叫建構函式或複製建構函式(具體視情況而定);如果存在,則是賦值,應該呼叫賦值操作符函式。
2. 隱式類型別轉換:用單個實參來呼叫的建構函式定義了從形參型別到類型別的乙個隱式轉換(c++ primer)。如果是多個實參,則無法完成隱式轉換。可以用關鍵字"explicit"宣告函式防止這種隱式轉換。
複製建構函式與賦值操作符
乙個類裡是否需要複製建構函式?有時候答案是 是 如果你的類在建構函式裡分配了資源,則可能需要乙個顯式的複製建構函式來管理資源。有析構函式的類通常用析構函式來釋放建構函式分配的資源,這通常也說明需要乙個複製建構函式。如果需要複製建構函式,則多半需要乙個賦值操作符。類x的賦值由x operator 來定...
C 複製建構函式與過載賦值操作符
c 拷貝建構函式 深拷貝,淺拷貝 c 中複製建構函式與過載賦值操作符總結 深拷貝和淺拷貝的區別 對深拷貝與淺拷貝的再次理解 禁止使用類的copy建構函式和賦值操作符 拷貝建構函式中的陷阱 在c 中建立乙個類,這個類中肯定會包括建構函式 析構函式 複製建構函式和過載賦值操作。複製建構函式是一種特殊的建...
複製建構函式VS賦值操作符過載
複製建構函式,又稱拷貝建構函式。是一種特殊的建構函式,它在建立物件時,是使用同一類中之前建立的物件來初始化新建立的物件。拷貝建構函式通常用於 如果在類中沒有定義拷貝建構函式,編譯器會自行定義乙個。如果類帶有指標變數,並有動態記憶體分配,則它必須有乙個拷貝建構函式。拷貝建構函式的最常見形式如下 cla...