首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Effective C++ 條款 05:C++ 默默為您撰寫的函式

     編輯:關於C++

編譯器隱式產生的四大成員函式

當類別未聲明時,編譯器會隱式宣告並視需要定義:

  1. 預設建構函式:ClassName()
  2. 複製建構函式:ClassName(const ClassName&)
  3. 複製指派運算子:ClassName& operator=(const ClassName&)
  4. 解構函式:~ClassName()

隱式版本做什麼事?

  • 預設建構/解構:依序呼叫基底類別與 non-static 成員變數的對應函式。
  • 複製建構/指派:對每個 non-static 成員變數執行逐成員複製(memberwise copy)。

逐成員複製範例

class NameObject {
    std::string nameValue;
    int objectValue;
public:
    NameObject(const char* n, int v) : nameValue(n), objectValue(v) {}
};

NameObject no1("Smallest Prime Number", 2);
NameObject no2(no1); // 複製建構
// 相當於:
// no2.nameValue = no1.nameValue; // 呼叫 string 複製建構
// no2.objectValue = no1.objectValue; // 逐位元複製 int

隱式複製失效的情況

當類別包含 reference 成員 或 const 成員 時,編譯器無法產生複製指派運算子(複製建構函式仍可產生,但指派會失敗):

class NameObject {
    std::string& nameValue; // reference 成員
    const int objectValue;  // const 成員
public:
    NameObject(std::string& n, int v) : nameValue(n), objectValue(v) {}
};

int main() {
    std::string a("A"), b("B");
    NameObject obj1(a, 1), obj2(b, 2);
    obj1 = obj2; // 編譯錯誤:無法重新繫結 reference、無法修改 const
}

最佳實踐

  • 若類語意適合逐成員複製(無 reference/const 成員、無原始指標管理資源),直接使用隱式版本,少寫代碼、少犯錯。
  • 若包含 reference/const 成員或管理資源(需深層複製),自行實作複製建構與指派(或 C++11 使用 = delete 拒絕)。
  • 遵循 Rule of Three/Five/Zero:若需要自訂三者之一(複製建構、複製指派、解構),通常三者都需自訂;C++11 加上移動建構/指派共五者;最理想是 Rule of Zero(善用 RAII 智慧指標/容器,完全不寫這些函式)。

總結

編譯器隱式產生的函式行為是「逐成員複製/銷毀」。理解其運作機制與限制(reference/const 成員),才能決定是否需要自行實作或拒絕。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved