第四篇:瞭解 C++ 默默編寫並呼叫的函式

穆晨發表於2017-01-27

前言

       對於一個類來說,最最基礎的三類成員函式莫過於:建構函式,解構函式以及拷貝函式 (copy建構函式和=過載函式)。即使你的類沒有為這些函式做出定義,C++ 也會自動為你建立。本文將講述的是 C++ “偷偷”為你建立的這三個函式究竟是怎麼樣的。

       瞭解這些,能更清楚程式碼是如何運轉的,從而寫出自己需求的(這三類)函式,確保物件高效,節約。

預設的建構函式和解構函式

       預設的建構函式/解構函式主要負責呼叫其基類的建構函式/解構函式。

預設的copy建構函式和=過載函式

       預設的這兩個函式僅僅是將物件的成員進行簡單賦值。

       這就意味著,如果該類的成員是指標型別,那麼當該類的兩個物件之間發生賦值後,這兩個物件中的指標就會指向同一片記憶體區。這種情況下,記憶體管理就會複雜起來,後面的文章中會詳細講解如何解決這個問題 - 在類的不同物件之間共享記憶體區。

       有時候,如果你不需要在記憶體中實現共享,完全可以自行定義這兩個函式,為被賦值的物件分配新的記憶體區。

       那麼,如果類成員是引用型別呢?如果物件之間成員只是簡單的複製,那麼豈非出現一個引用型變數引用了新的變數?這是違反 C++ 的”不允許引用型變數改指向不同的物件“這一原則的。

       答案是 - C++ 會拒絕編譯那一行的賦值操作。

小結

       1. 編譯器所做的工作等效於:

1 class Empty {
2 public:
3     Empty(){}    // 預設建構函式
4     Empty(const Empty &rhs){}    // 預設拷貝建構函式
5     ~Empty(){}    // 預設解構函式
6     Empty & operator= (const Empty &rhs);    // 預設賦值運算子過載函式
7 };

       2. 如果 C++ 預設為你定義的這三類函式不合你的要求,這也是經常發生的,那麼你就需要結合實際情況,定製出最適合自己的函式。

       3. 這三類函式非常重要,請一定要確保其正確性,效率性,否則專案後期因此而產生的記憶體洩露等問題是非常讓人頭大的。

相關文章