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

Effective C++ 條款 06:若不想要編譯器自動產生的函式,請明確拒絕

     編輯:關於C++

背景

C++ 編譯器會為類別隱式產生:預設建構函式、複製建構函式、複製指派運算子、解構函式。若類別語意不可複製(如代表唯一實體、管理獨佔資源),必須明確刪除或宣告為 private 且不定義這些函式。

傳統做法(C++98):宣告為 private 且不實作

class Family {
private:
    Family(const Family&);             // 複製建構函式
    Family& operator=(const Family&); // 複製指派運算子
};
  • 外部呼叫 → 編譯錯誤(存取 private)。
  • 成員函式或 friend 呼叫 → 連結錯誤(未定義)。

改良:建立不可複製基底類別(Uncopyable Idiom)

class Uncopyable {
protected:
    Uncopyable() {}          // 允許衍生類別建構
    ~Uncopyable() {}         // 允許衍生類別解構
private:
    Uncopyable(const Uncopyable&);
    Uncopyable& operator=(const Uncopyable&);
};

class Family : private Uncopyable { // private 繼承:is-implemented-in-terms-of
    // Family 現在不可複製
};

優點:集中管理、語意清晰、衍生類別自動不可複製。

現代 C++11 做法:= delete

class Family {
public:
    Family() = default;
    Family(const Family&) = delete;
    Family& operator=(const Family&) = delete;
};
  • 編譯期即報錯,訊息更明確。
  • 可搭配 = default 明確保留預設行為。
  • 同樣適用於移動建構/指派(Family(Family&&) = delete;)。

為什麼要拒絕?

  • 語意上唯一實體(如 Singleton、Mutex、Thread、資料庫連線)。
  • 資源管理類別(RAII)若複製會導致雙重釋放或邏輯錯誤。
  • 效能考量:避免昂貴的深層複製。

總結

「明確拒絕」比「靠編譯器隱式產生」更安全、更具表達力。C++11 以降請優先使用 = delete;舊標準請採用 Uncopyable 基底類別慣用語。

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