C++ 編譯器會為類別隱式產生:預設建構函式、複製建構函式、複製指派運算子、解構函式。若類別語意不可複製(如代表唯一實體、管理獨佔資源),必須明確刪除或宣告為 private 且不定義這些函式。
class Family {
private:
Family(const Family&); // 複製建構函式
Family& operator=(const Family&); // 複製指派運算子
};
class Uncopyable {
protected:
Uncopyable() {} // 允許衍生類別建構
~Uncopyable() {} // 允許衍生類別解構
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
class Family : private Uncopyable { // private 繼承:is-implemented-in-terms-of
// Family 現在不可複製
};
優點:集中管理、語意清晰、衍生類別自動不可複製。
= deleteclass Family {
public:
Family() = default;
Family(const Family&) = delete;
Family& operator=(const Family&) = delete;
};
= default 明確保留預設行為。Family(Family&&) = delete;)。Singleton、Mutex、Thread、資料庫連線)。「明確拒絕」比「靠編譯器隱式產生」更安全、更具表達力。C++11 以降請優先使用 = delete;舊標準請採用 Uncopyable 基底類別慣用語。