C++进阶--不让编译器自动生成类函数

//############################################################################
/*
 * 不让编译器自动生成类函数
 *
 *
 *
 * 并不是所有的类都需要编译器自动生成类函数
 *
 * 例:  一个"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.
" << endl; }
};

int main ()
{
  dog* dog1 = new dog();
  dog1->destroyMe();
}


/* 使用场景: 1. 引用计数的智能指针
 *        2. 栈空间很小的嵌入式编程 //只能在堆上保存,因为如果是在栈上生成,堆栈rewind的时候肯定会调析构函数
 */
原文地址:https://www.cnblogs.com/logchen/p/10165145.html