=default =delete

=default, =delete

如果你自行定义一个 ctor,那么编译器就不会再给你一个 default ctor(包括了构造函数,拷贝构造函数,拷贝赋值函数)。

如果你强制加上了 =default,就可以重新获得并使用 default ctor。

Big Three

就是所谓的:

  • 构造函数
  • 拷贝构造函数
  • 拷贝赋值函数
  • 析构函数

Big Five

就是所谓的:

  • 构造函数
  • 拷贝构造函数
  • 移动构造函数(move ctor)
  • 拷贝赋值函数
  • 移动赋值函数(move assignment)
  • 析构函数

=default 用于 Big-Five 之外是没有任何意义的,编译器会报错!!

=delete 可用于任何函数身上 (=0 只能用于 virtual 函数上)

Know what functions C++ silently writes and calls

什么时候 empty class 不再是 empty 呢?当 C++ 处理过它之后!

是的,如果你自己没有声明,编译器就会为它声明一个 copy ctor、一个 copy assignment operator 和一个 dtor (都是所谓 synthesized version)。如果你没有声明任何 ctor,编译器也会为你声明一个 default ctor。所有这些函数都是 public 且 inline 的。

class Empty{};

{
    Empty e1;
    Empty e2(e1);
    e2 = e1;
}

例如上述代码,Empty 类是空的,但是当 Big-Three 需要被调用时,编译器就会为这个空类自动生成 Big-Three,如下所示:

class Empty{
public:
    Empty(){}
    Empty(const Empty &rhs){}
    Empty& operator=(const Empty &rhs){}

    ~Empty(){}
};

那什么时候需要自己写 Big-Three ,什么时候用默认的就可以了呢?

    1. 当类中存在 pointer member 时一般都需要自己写一个 Big-Three,来管理指针。
    1. 当类中涉及堆内存分配时需要自己写 Big-Three

其他的情况一般用编译器默认的 Big-Three 即可。。。

原文地址:https://www.cnblogs.com/Codroc/p/13998383.html