默认的(defaulted)函数允许你允许你告诉编译器必须为你编写这个函数,作为其“默认”实现。当然,你只能对编译器可以自动生成的函数这样做,包括默认构造函数、析构函数、拷贝构造函数、移动构造函数、拷贝赋值操作符和移动赋值操作符。
使用该函数的原因:
- 为了改变函数的可访问性。在默认情况下,编译器生成的函数是public的。如果你希望将它们变为protected或者private,你就得亲自去编写它们。通过将它们声明为defaulted,你就可以让编译器去编写这些函数,同时又改变它们的访问级别。
- 作为注解。即使编译器生成的版本足够使用,仍然值得像这样将其显式进行声明,以便于你或者其他人将来再看代码的时候能够清楚的了解这是有意为之。
- 为了强制编译器去生成该函数,否则它们可能不会这么做。典型的是针对默认构造函数,只有在没有用户自定义构造函数的时候它才通常会由编译器去生成。如果你需要自定义一个拷贝构造函数,你仍然可以通过声明一个defaulted的默认构造函数,而让编译器生成它。
- 为了将一个析构函数设为虚拟的,将其留给编译器来生成。
- 强制声明一个特定的拷贝构造函数,如令其接受一个非const引用的原参数而不是一个const引用。
- 利用编译器生成函数的一些特定属性,如果你自己提供实现的话,可能会失去它们。
例子:
class Y
{
private:
Y() = default; //改变访问级别
public:
Y(Y&) = default; //接受一个非常量引用
Y& operator=(const Y&) = default; //声明为defaulted作为注解
protected:
virtual ~Y() = default; //改变访问级别并且添加virtual
};