1. 程式人生 > >C++進階--不讓編譯器自動生成類函數

C++進階--不讓編譯器自動生成類函數

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++進階--不讓編譯器自動生成類函數