C++ =delete 和 =default

背景

C++ 的类有六类特殊的成员函数,分别为:默认构造函数析构函数拷贝函数拷贝赋值函数移动构造函数移动拷贝函数。如果程序没有显式地为一个类定义某个特殊成员函数,而又需要用到该特殊成员函数时,编译器会隐式地为这个类生成一个默认的特殊成员函数。

=default

例子

class DataOnly { 
public:     
    DataOnly ()                  // default constructor     
    ~DataOnly ()                 // destructor      
    DataOnly (const DataOnly & rhs)              // copy constructor     
    DataOnly & operator=(const DataOnly & rhs)    // copy assignment operator      
    DataOnly (const DataOnly && rhs)         // C++11, move constructor     
    DataOnly & operator=(DataOnly && rhs)    // C++11, move assignment operator 
};

使用规则

  1. default 函数特性仅用于类的特殊成员函数,且该特殊成员函数没有默认参数

    class X {
    public:
        int f() = default: //错误, f()非特殊成员函数
        X(int) = default; //错误, 非特殊成员函数
        X(int i = 1) = default; // 错误, 含有默认参数
    }
    
  2. 既可以在类体里定义(inline),也可以在类体外(out-of-line)定义

class X {
public:
    X() = default; // inline
    X(const X&); // 
    X& operator = (const X&);
    ~X() = default; // inline
}

X::X(const X&) = default; // out of line
X& X::operator = (const X&) = default; // out of line

=delete

为了显式的禁用某个函数,C++11 标准引入了一个新特性:delete 函数。

class X{            
public: 
  X(); 
  X(const X&) = delete;  // 声明拷贝构造函数为 deleted 函数
  X& operator = (const X &) = delete; // 声明拷贝赋值操作符为 deleted 函数
}; 

class Y{ 
public: 
    // 禁止使用者在堆上申请对象
  void *operator new(size_t) = delete; 
  void *operator new[](size_t) = delete; 
}; 

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容