C++ 拷貝建構函式和拷貝賦值運算子的區別
阿新 • • 發佈:2020-10-27
轉自: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 Constructorcout<<"-----"<<endl; p2 = f1(); // Assign cout<<"-----"<<endl; Person p3 = f1(); //
return 0; } #輸出: 無參建構函式 Copy Constructor 無參建構函式 Assign Copy Constructor ----- 無參建構函式 Assign ----- 無參建構函式
唯一不明白的地方是最後一句,呼叫了f1內部建立了物件,列印“無參建構函式”,那麼又賦值給p3,為什麼沒呼叫拷貝建構函式呢?不明白。