C++進階--不讓編譯器自動生成類函數
阿新 • • 發佈:2018-12-23
ssi his 智能 自動生成函數 解決方法 rhs 生成 sign per
//############################################################################ /* * 不讓編譯器自動生成類函數 * * * * 並不是所有的類都需要編譯器自動生成類函數 * * 例: 一個"OpenFile" 類表示一個被打開的文件。構造函數至少需要一個文件名作為參數 * 所有不需要默認構造函數 */ 那麽如何讓編譯不自動生成函數 /* * 對於C++ 11: */ class dog { public: dog(const dog& ) = delete; // 直接使用delete關鍵字即可 // 當資源不可共享時將拷貝構造禁用 } /* 對於C++ 03: * 1. Default constructor. - 簡單 2. Copy constructor. - 見以下解決方法 3. Copy Assignment Operator. - 見以下解決方法 方法1: 將其聲明為private函數,但是不定義它們 -- 對於成員和友元,會鏈接時錯誤,因為沒有實現 -- 對於其他,會編譯時錯誤 */ class dog { private: dog& operator=(const dog& rhs); }; /* 方法2: 在基類中,將其聲明為private函數,但是不定義它們 -- 編譯時錯誤 */ class yellowdog : public dog { }; int main() { yellowdog y1("henry"); yellowdog y2; y2 = y1; } // 註意:以上方法可以用於禁用任何函數 /* 問題:析構函數是否可以被禁用?使用場景? */ /* 方法 */ class dog { public: void destroyMe() { delete this; } private: ~dog() { cout<< m_name.m_str << " is destroyed.\n" << endl; } }; int main () { dog* dog1 = new dog(); dog1->destroyMe(); } /* 使用場景: 1. 引用計數的智能指針 * 2. 棧空間很小的嵌入式編程 //只能在堆上保存,因為如果是在棧上生成,堆棧rewind的時候肯定會調析構函數 */
C++進階--不讓編譯器自動生成類函數