條款 05:瞭解 C++ 默默編寫並調用了哪些函數

條款 05:瞭解 C++ 默默編寫並調用了哪些函數

Know what functions C++ silently writes and calls.

C++ 編譯器會自動創建哪些函數

對於一個空類,編譯器可能默默生成下面四個函數。

class A {};

class A {
public:
    A() {...}
    A(const A& rhs) {...}
    ~A() {...}
    A& operator=(const A& rhs) {...}
};
  • 只有在這些函數被需要、被調用時,編譯器纔會默認生成:構造、拷貝構造、析構、拷貝賦值這四個函數。
  • 默認生成的構造、析構函數被用來調用“隱藏”的代碼,如基類的構造、析構函數
  • 默認析構函數是 non-virtual,除非繼承自父類的 virtual 析構函數
  • 當存在構造函數時,編譯器不會再自動生成無參默認構造函數
  • 編譯器的默認 copy 構造函數,會把每一個 non-static 成員變量拷貝到目標對象
  • 當情況不合適時,編譯器拒絕生成默認函數,如下列情況:
    • 當含有 reference 成員變量
    • 當含有 const 成員變量
    • 當基類 copy assignment 函數爲 private 時。因爲默認生成的 copy assignment 函數想調用基類的 copy assignment 函數而不得。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章