C++ 构造函数中X()=delete的差异;和私有X();

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类仍然可以调用构造函数(除非您也定义

让我们假设我们有一个类X,并且我们希望wo明确禁止,比如说标准构造函数。我在头文件中使用了很长时间:

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:当您查看的对象类没有明显的“默认”时存在,即始终需要使用数据进行初始化。删除默认构造函数可确保不会意外创建任何不合理、未初始化的对象。