c++ - 在 C++ 中显式声明默认方法

标签 c++ c++11 default delete-operator code-structure

<分区>

根据 C++11 标准,您可以使用 default 关键字将特殊成员函数声明为默认值。

class Foo
{
public:
    Foo() = default;
    Foo(const Foo& source) = default;
    Foo(Foo&& source) = default;
    ~Foo() = default;
    Foo& operator=(const Foo& right) = default;
    Foo& operator=(Foo&& right) = default;
};

我想知道如果您不需要自定义实现这些方法,那么将所有这些方法显式声明为默认或删除是否是一个好习惯。例如,我需要为我的类实现复制构造函数和复制赋值运算符。我是否应该用 defaultdelete 关键字标记所有其他特殊成员函数,以便在每次查看由编译器提供而哪些不是的类时都不会思考?

最佳答案

这取决于。编译器何时以及是否自动生成这些函数是有规则的。在编译器不会这样做而您需要它们的情况下,您可以强制它使用默认值或自己实现来生成它们。编译器不会生成函数的情况是(这不是完整列表,请引用您的编译器文档):

  • 声明带参数的构造函数时不生成默认构造函数
  • 声明复制构造函数和复制赋值运算符时,不会生成移动构造函数和移动赋值运算符(反之亦然)

因此,在这些情况下,如果您知道某处需要它们,您可能希望使用 default 将它们取回。然而,在大多数情况下,您应该让编译器完成它的工作。如果其中一个函数未自动实现,您将收到错误消息。

附言Visual Studio 尚不支持移动构造函数和移动赋值运算符的 defaultdelete

关于c++ - 在 C++ 中显式声明默认方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24862222/

相关文章:

C++ - 如何将元素从 std::priority_queue 复制到 std::vector

c++ - 修复重载运算符 '+' 的使用不明确?

matlab - 如何在 MATLAB 中设置函数参数的默认值?

sql - 如何修改 SQL 中的默认值以接受 Y 或 N 而不仅仅是 Y

c++ - 将扩展字符转换为 int

c++ - 如何在shell脚本中调用c++程序

objective-c 头文件中的 C++ 类声明

c++ - 如何使用构造函数委托(delegate)在 C++ 中使用命名构造函数?

c++ - 将 C++11 转换为等效的 C++98 代码

c++ - Eclipse C++ 默认 "Hello World"错误