調用C++複製構造函數和拷貝構造函數

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的值,所以使用複製構造函數。不過,正如前面指出的,實現時也可能分兩步來處理這條語句:使用複製構造函數建立一個臨時對象,而後經過賦值將臨時對象的值複製到新對象中。這就是說,初始化老是會調用複製構造函數,而使用=操做符時也可能調用賦值操做符

相關文章
相關標籤/搜索