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往往是一個很好地選擇。
相關文章
- Copy of a Copy of a Copy
- C++ Copy ElisionC++
- 宣告 NSString 型別的屬性,到底用 strong 還是 copy ?型別
- 判斷使用的是 x11 還是 wayland
- JS 判斷客戶端是iOS還是AndroidJS客戶端iOSAndroid
- fastjson判斷JSON字串是Object還是List<Object>ASTJSON字串Object
- cv2 判斷圖片是冷還是暖
- python 判斷變數是數字型還是字元型Python變數字元
- Linux下判斷磁碟是SSD還是HDD的3種方法Linux
- js 判斷是手機訪問,還是pc訪問JS
- windows 之醬紫判斷是UEFI還是legacy啟動Windows
- JAVA關於判斷年份是閏年還是平年的問題Java
- COPY & SYS
- PostgreSQL:COPYSQL
- 深copy
- 判斷javaScript變數是Ojbect型別還是Array型別JavaScript變數型別
- REDHAT中如何判斷主機的CPU是32位還是64位的Redhat
- 判斷客戶端是iOS還是Android,判斷是不是在微信瀏覽器開啟客戶端iOSAndroid瀏覽器
- 女朋友問我深淺copy到底是什麼?
- 判斷在移動端還是PC開啟
- ionic-判斷是裝置時手機還是平板(iPad,tablet)iPad
- 筆記: 判斷lib庫是動態庫還是靜態庫筆記
- 面試題分解—「淺複製/深複製、定義屬性使用copy還是strong ?」面試題
- JDK是如何判斷兩個物件是否相同的?判斷的流程是什麼?JDK物件
- 做個地道的c++程式猿:copy and swap慣用法C++
- 怎麼判斷Win10系統中硬碟是SSD還是HDDWin10硬碟
- 判斷當前訪問的使用者是 PC端 還是 手機端
- javascript中怎麼判斷某變數是null,undefined,還是不存這個變數 ? 以及變數是array 還是 object 還是 null ?JavaScript變數NullUndefinedObject
- 判斷是什麼字元字元
- copy& deepcopy pythonPython
- Dockerfile:ADD VS COPYDocker
- Python深淺copyPython
- 1.3.2.1.2.2 Snapshot Copy PDBs
- 在tmux中copyUX
- 如何判斷頁面是pc端還是移動端,進入不同的頁面
- Spring動態代理的生成-如何判斷是使用JDK動態代理還是CGlib代理SpringJDKCGLib
- vue 判斷使用者處於手機還是PCVue
- Rust中的Copy和CloneRust
- wild copy型漏洞的利用