1. 什麼時候調用複製構造函數 函數
複製構造函數用於將一個對象複製到新建立的對象中。也就是說,它用於初始化過程當中,而不是常規的賦值過程當中。類的複製構造函數原型一般以下: spa
class_name(const class_name&); 指針
它接受一個指向類對象的常量引用做爲參數。例如,String類的複製構造函數的原型以下: 對象
String(const String&); 原型
新建一個對象並將其初始化爲同類現有對象時,複製構造函數都將被調用。這在不少狀況下均可能發生,最多見的狀況是將新對象顯示地初始化爲現有的對象。例如,假設motto是一個String對象,則下面4種聲明都將調用複製構造函數: it
String ditto(motto); class
String metoo = motto; test
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的值,所以使用複製構造函數。不過,正如前面指出的,實現時也可能分兩步來處理這條語句:使用複製構造函數建立一個臨時對象,而後經過賦值將臨時對象的值複製到新對象中。這就是說,初始化老是會調用複製構造函數,而使用=操做符時也可能調用賦值操做符