C++ 构造函数中X()=delete的差异;和私有X();
让我们假设我们有一个类X,并且我们希望wo明确禁止,比如说标准构造函数。我在头文件中使用了很长时间:C++ 构造函数中X()=delete的差异;和私有X();,c++,oop,constructor,delete-operator,C++,Oop,Constructor,Delete Operator,让我们假设我们有一个类X,并且我们希望wo明确禁止,比如说标准构造函数。我在头文件中使用了很长时间: private: X(); // 1. 所以,对任何人来说,这个建构者都是在课外被禁用的。但最近我了解到,在C++11中,建议使用以下方法: X() = delete; // 2. 这两种方法都能实现我禁止标准施工的愿望 但它们之间的确切区别是什么?为什么C++11会推荐最后一个?2中是否设置了任何其他标志、信号。方法?前者有点像黑客。friend类仍然可以调用构造函数(除非您也定义
private:
X(); // 1.
所以,对任何人来说,这个建构者都是在课外被禁用的。但最近我了解到,在C++11中,建议使用以下方法:
X() = delete; // 2.
这两种方法都能实现我禁止标准施工的愿望
但它们之间的确切区别是什么?为什么C++11会推荐最后一个?2中是否设置了任何其他标志、信号。方法?前者有点像黑客。friend类仍然可以调用构造函数(除非您也定义了构造函数,否则在链接时会出现错误)
后者实际上阻止了它的自动生成,所以它实际上不存在。在C++11中出现的
=delete
之前,示例1就是这样做的。现在我们有了=delete
,这将完全摆脱构造函数。通过将构造函数设为私有,您仍然可以在成员函数中使用该构造函数,如果您尝试在成员函数中使用=delete
默认对象,则将是编译器错误
#include <iostream>
class Foo
{
Foo();
public:
static void SomeFunc() { Foo f; }
};
class Bar
{
public:
Bar() = delete;
static void SomeFunc() { Bar b; }
};
int main()
{
Foo::SomeFunc(); // will compile
Bar::SomeFunc(); // compiler error
}
#包括
福班
{
Foo();
公众:
静态void SomeFunc(){Foo f;}
};
分类栏
{
公众:
Bar()=删除;
静态void SomeFunc(){Bar b;}
};
int main()
{
Foo::SomeFunc();//将编译
Bar::SomeFunc();//编译器错误
}
在这种情况下,两者都不是。没有理由禁用默认构造函数。对于第一个,您仍然可以从类内调用默认构造函数,这在第二个版本中是不可能的。@avakar:禁用默认构造函数是有原因的。@PaulJ.Lucas,举一个例子。@avakar:当您查看的对象类没有明显的“默认”时存在,即始终需要使用数据进行初始化。删除默认构造函数可确保不会意外创建任何不合理、未初始化的对象。