zoukankan      html  css  js  c++  java
  • 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的时候肯定会调析构函数
     */
    
  • 相关阅读:
    正则表达式复习 (?<=) (?=)
    HTML 30分钟入门教程
    C# 多线程详解
    C# List
    C# 枚举
    C# 线程数
    C# 泛型2
    C# 泛型
    C# 结构体
    不用Google Adsense的84个赚钱方法
  • 原文地址:https://www.cnblogs.com/logchen/p/10165145.html
Copyright © 2011-2022 走看看