1. 程式人生 > 實用技巧 >C++ 拷貝建構函式和拷貝賦值運算子的區別

C++ 拷貝建構函式和拷貝賦值運算子的區別

轉自:https://www.cnblogs.com/wangguchangqing/p/6141743.html

1.區別

拷貝建構函式和賦值運算子的行為比較相似,都是將一個物件的值複製給另一個物件;

但是其結果卻有些不同,拷貝建構函式使用傳入物件的值生成一個新的物件的例項,而賦值運算子是將物件的值複製給一個已經存在的例項

拷貝建構函式也是一種建構函式,那麼它的功能就是建立一個新的物件例項;賦值運算子是執行某種運算,將一個物件的值複製給另一個物件(已經存在的)。

呼叫的是拷貝建構函式還是賦值運算子,主要是看是否有新的物件例項產生。如果產生了新的物件例項,那呼叫的就是拷貝建構函式;如果沒有,那就是對已有的物件賦值,呼叫的是賦值運算子

2.例子

class Person
{
public:
    Person(){cout<<"無參建構函式"<<endl;}
    Person(const Person& p)
    {
        cout << "Copy Constructor" << endl;
    }

    Person& operator=(const Person& p)
    {
        cout << "Assign" << endl;
        return *this;
    }

private: int age; string name; }; void f(Person p) { return; } Person f1() { Person p;//無參建構函式 return p; } int main(){ Person p; //無參建構函式 Person p1 = p; // Copy Constructor Person p2; //無參建構函式 p2 = p; // Assign f(p2); // Copy Constructor
cout<<"-----"<<endl; p2 = f1(); // Assign cout<<"-----"<<endl; Person p3 = f1(); //
    return 0;
} #輸出: 無參建構函式 Copy Constructor 無參建構函式 Assign Copy Constructor ----- 無參建構函式 Assign ----- 無參建構函式

唯一不明白的地方是最後一句,呼叫了f1內部建立了物件,列印“無參建構函式”,那麼又賦值給p3,為什麼沒呼叫拷貝建構函式呢?不明白。