本文主要介紹了拷貝構造函數(shù)和賦值運算符的區(qū)別,以及在什么時候調用拷貝構造函數(shù)、什么情況下調用賦值運算符。最后,簡單的分析了下深拷貝和淺拷貝的問題。

拷貝構造函數(shù)和賦值運算符

在默認情況下(用戶沒有定義,但是也沒有顯式的刪除),編譯器會自動的隱式生成一個拷貝構造函數(shù)和賦值運算符。但用戶可以使用delete來指定不生成拷貝構造函數(shù)和賦值運算符,這樣的對象就不能通過值傳遞,也不能進行賦值運算。

class Person
{public:

    Person(const Person& p) = delete;

    Person& operator=(const Person& p) = delete;private:    int age;    string name;
};

上面的定義的類Person顯式的刪除了拷貝構造函數(shù)和賦值運算符,在需要調用拷貝構造函數(shù)或者賦值運算符的地方,會提示_無法調用該函數(shù),它是已刪除的函數(shù)_。
還有一點需要注意的是,拷貝構造函數(shù)必須以引用的方式傳遞參數(shù)。這是因為,在值傳遞的方式傳遞給一個函數(shù)的時候,會調用拷貝構造函數(shù)生成函數(shù)的實參。如果拷貝構造函數(shù)的參數(shù)仍然是以值的方式,就會無限循環(huán)的調用下去,直到函數(shù)的棧溢出。

何時調用

拷貝構造函數(shù)和賦值運算符的行為比較相似,都是將一個對象的值復制給另一個對象;但是其結果卻有些不同,拷貝構造函數(shù)使用傳入對象的值生成一個新的對象的實例,而賦值運算符是將對象的值復制給一個已經(jīng)存在的實例。這種區(qū)別從兩者的名字也可以很輕易的分辨出來,拷貝構造函數(shù)也是一種構造函數(shù),那么它的功能就是創(chuàng)建一個新的對象實例;賦值運算符是執(zhí)行某種運算,將一個對象的值復制給另一個對象(已經(jīng)存在的)。調用的是拷貝構造函數(shù)還是賦值運算符,主要是看是否有新的對象實例產(chǎn)生。如果產(chǎn)生了新的對象實例,那調用的就是拷貝構造函數(shù);如果沒有,那就是對已有的對象賦值,調用的是賦值運算符。

調用拷貝構造函數(shù)主要有以下場景:

  • 對象作為函數(shù)的參數(shù),以值傳遞的方式傳給函數(shù)?!?/p>

  • 對象作為函數(shù)的返回值,以值的方式從函數(shù)返回

  • 使用

    網(wǎng)友評論