Effective C++是copy constructor 還是 copy assignment(“=”)的判斷

JUAN425發表於2014-08-01

copy 建構函式被用來“以同型物件初始化自我物件”。 copy assignment(當然衝在了=) 被用來“從另一個同型物件中拷貝其值到自我物件”。

例如下例:

class Wiget {
   public:
      Widget(); // default constructor
      Widget(const Widget& rhs);
      Widget& operator=(const Widget& rhs);
      ...
};


Widget w1; // 呼叫default constructor
Widget w2(w1); // 呼叫copy constructor
w1 = w2; // 呼叫copy assigment operator, 因為w1, w2 構建出出來了

但是, 當你看到賦值符號的時候, 必須小心。 因為“=”語法也可以用來呼叫從copy constructor:

Widget w3 = w2; // 呼叫賦值建構函式, 因為w3 是一個新定義的物件。

幸運的是, “copy 構造” 很容易和“copy 賦值”區分開來。 如果一個新物件被定義式, 一定會有一個建構函式被呼叫(如w3), 不可能呼叫賦值操作, 如果沒有新物件定義, (例如前面的w1 = w2), 就不會有建構函式被呼叫。 當然就是賦值操作。

NOTE: 關於建構函式, 也可以按照如下呼叫:

Widget w4 = Widget();


Copy 建構函式非常重要, 因為當該類物件需要pass by value作為引數傳遞給函式(形參 )的時候, 這個將實參複製給形參就需要通過copy 建構函式完成。 例如:


bool hasAccepted(Widget w);
............

Widget aWidget;
if(hasAccepted(aWidget))....

引數w 是以pass by value 的方式傳遞給函式hasAccepted, 所以上述呼叫中, aWidget被複制到w體內, 這個複製動作需要有Widget 的複製建構函式完成。 “pass by value” 意味著呼叫複製建構函式。 以by value 的方式傳遞使用者自定義型別通常是一個壞主意,  pass-by-reference -to-const往往是一個很好地選擇。


 




相關文章