默认的方法和禁用的方法
假定要使用某个默认的函数,而这个函数由于某种原因不会自动创建。
例如,提供了移动构造函数,因此编译器不会自动创建默认的构造函数、复制构造函数和复制赋值构造函数。
在这些情况下,可以使用关键字default显式地声明这些方法的默认版本:
class Someclass
{
public:
Someclass(Someclass &&);
Someclass() = default;
Someclass(const Someclass &) = default;
Someclass & operator=(const Someclass &) = default;
};
编译器将创建在没有提供移动构造函数的情况下将自动提供的构造函数。
关键字delete可用于禁止编译器使用特定方法。例如,要禁止复制对象,可禁用复制构造函数和复制赋值运算符:
class Someclass
{
public:
Someclass() = default;
Someclass(const Someclass &) = delete;
Someclass & operator=(const Someclass &) = delete;
Someclass(Someclass &&) = default;
Someclass & operator=(Someclass &&) = default;
Someclass & operator+(const Someclass &) const;
};
要禁止复制,也可将复制构造函数和赋值运算符放在类定义的private部分,但使用delete更不容易犯错、更容易理解。
禁用函数的重要一点:它们只用于查找匹配函数,使用它们将导致编译错误。