Effective C++是copy constructor 還是 copy assignment(“=”)的判斷
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往往是一個很好地選擇。
相關文章
- Default copy constructor does not call correct base(轉) constructorStruct
- Copy of a Copy of a Copy
- 判斷使用的是 x11 還是 wayland
- C++ Copy ElisionC++
- 宣告 NSString 型別的屬性,到底用 strong 還是 copy ?型別
- JavaScript判斷陣列還是物件JavaScript陣列物件
- PHP判斷是手機端還是PC端PHP
- Android app 判斷是手機還是平板AndroidAPP
- 判斷是蘋果系統還是安卓系統的代蘋果安卓
- JS 判斷客戶端是iOS還是AndroidJS客戶端iOSAndroid
- 判斷客戶端是微信,還是支付寶客戶端
- cv2 判斷圖片是冷還是暖
- python 判斷變數是數字型還是字元型Python變數字元
- windows 之醬紫判斷是UEFI還是legacy啟動Windows
- fastjson判斷JSON字串是Object還是List<Object>ASTJSON字串Object
- js 判斷是手機訪問,還是pc訪問JS
- js如何判斷一個變數是物件還是nullJS變數物件Null
- jquery判斷一個元素是隱藏還是顯示jQuery
- JAVA關於判斷年份是閏年還是平年的問題Java
- js如何判斷物件的屬性值是物件還是陣列JS物件陣列
- Linux下判斷磁碟是SSD還是HDD的3種方法Linux
- JavaScript判斷ios還是android系統JavaScriptiOSAndroid
- js如何判斷一個方法是內建的還是自定義的JS
- 判斷javaScript變數是Ojbect型別還是Array型別JavaScript變數型別
- 如何判斷是手機還是電腦訪問網站網站
- 判斷Android 系統是MIUI 的,魅族的Flyme ,還是原生的?AndroidUI
- js如何判斷屬性是本身具有還是繼承別人的JS繼承
- 判斷是android安卓還是ios蘋果系統的js程式碼Android安卓iOS蘋果JS
- REDHAT中如何判斷主機的CPU是32位還是64位的Redhat
- 判斷客戶端是iOS還是Android,判斷是不是在微信瀏覽器開啟客戶端iOSAndroid瀏覽器
- 判斷ORACLE啟動時使用spfile還是pfileOracle
- js如何判斷一個變數是陣列還是其他物件JS變數陣列物件
- php判斷檔案存在是用file_exists還是is_filePHP
- 判斷訪問網頁的是移動裝置還是pc裝置網頁
- java判斷IOS還是安卓,跳轉不同的連線JavaiOS安卓
- JDK是如何判斷兩個物件是否相同的?判斷的流程是什麼?JDK物件
- 面試題分解—「淺複製/深複製、定義屬性使用copy還是strong ?」面試題
- javascript中怎麼判斷某變數是null,undefined,還是不存這個變數 ? 以及變數是array 還是 object 還是 null ?JavaScript變數NullUndefinedObject