前言
對於一個類來說,最最基礎的三類成員函式莫過於:建構函式,解構函式以及拷貝函式 (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. 這三類函式非常重要,請一定要確保其正確性,效率性,否則專案後期因此而產生的記憶體洩露等問題是非常讓人頭大的。