Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_C++11_Default_Delete Operator_Code Structure - Fatal编程技术网

C++ 在C++;

C++ 在C++;,c++,c++11,default,delete-operator,code-structure,C++,C++11,Default,Delete Operator,Code Structure,根据C++11标准,您可以使用default关键字将特殊成员函数声明为默认值 class-Foo { 公众: Foo()=默认值; Foo(const Foo&source)=默认值; Foo(Foo&&source)=默认值; ~Foo()=默认值; Foo&operator=(const Foo&right)=默认值; Foo&operator=(Foo&right)=默认值; }; 我想知道,如果不需要自定义实现,那么将所有这些方法显式声明为默认或删除是一种好的做法吗。例如,我需要为我的

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

class-Foo
{
公众:
Foo()=默认值;
Foo(const Foo&source)=默认值;
Foo(Foo&&source)=默认值;
~Foo()=默认值;
Foo&operator=(const Foo&right)=默认值;
Foo&operator=(Foo&right)=默认值;
};

我想知道,如果不需要自定义实现,那么将所有这些方法显式声明为默认或删除是一种好的做法吗。例如,我需要为我的类实现复制构造函数和复制赋值操作符。我是否应该用
default
delete
关键字标记所有其他特殊成员函数,以避免每次查看编译器提供的类和非编译器提供的类时都进行思考。编译器何时以及是否自动生成这些函数有一些规则。如果编译器不这样做,而您需要它们,您可以使用默认值强制编译器生成它们或自己实现它们。编译器无法生成函数的情况有(这不是完整列表,请参阅编译器文档):

  • 声明带有参数的构造函数时,不会生成默认构造函数
  • 声明复制构造函数和复制赋值运算符(反之亦然)时,不会生成移动构造函数和移动赋值运算符
因此,在这些情况下,如果您知道某个地方需要它们,您可能希望使用
default
将它们带回来。然而,在大多数情况下,您应该让编译器完成它的工作。如果其中一个函数没有自动实现,则会出现错误


VisualStudio不支持“代码>默认值>代码>和<代码>删除>代码>移动构造函数和移动赋值运算符,但是.< /p> IMO,它是纯噪声:它并没有给(好)C++程序员已经知道的东西加上任何东西。@ Park Young BAE,你能回答它吗?我可以接受它吗?我想OP知道这个。他在问,在完全没有必要的情况下,默认或删除这些方法是否是一种好的做法。@rashmatash感谢您的回答,但juanchopanza的假设绝对准确。我确实知道方法的创建条件,并且对在我并不真正需要它们的时候声明它们是否是一种好的实践感兴趣。而且,不是编译器决定的。语言规范中规定了这些规则。