如何禁止在 C++ 中使用默认构造函数?

Posted

技术标签:

【中文标题】如何禁止在 C++ 中使用默认构造函数?【英文标题】:How to forbid the use of the default constructor in C++? 【发布时间】:2011-12-25 11:14:17 【问题描述】:

我不想在我的程序中创建一个对象而不向构造函数传递参数。

有办法吗?

【问题讨论】:

【参考方案1】:

虽然其他答案都是正确的,但 C++11 中有一种新技术可以表达这一点:deleted default constructor

它允许在不依赖任何其他技巧的情况下禁止功能。它还在代码中清楚地表达了您的意图。

class X
 
public:
    X(int) 
    X() = delete; // will never be generated
;

int main()
 
    X x; // will not compile;
    X y(1); // will compile.
    return 0;

【讨论】:

【参考方案2】:

当您声明任何其他构造函数时,编译器不会为您生成默认构造函数。如果你已经指定了一个默认的无参数构造函数,你可以将其设为私有。

请记住,编译器可以为一个类自动生成这 4 个成员函数中的每一个。

默认无参数构造函数 默认析构函数 复制构造函数 赋值运算符

但是如果你自己声明了一个,它不会生成一个默认的,也就是说,如果你自己声明了一个构造函数,它不会创建默认的构造函数。如果您没有声明其他 3 个中的任何一个,编译器可以生成它们。

edit:请注意,此信息适用于 C++03,但在 C++11 中有所不同,正如 Matthieu M. 在 cmets 中提到的那样。 C++11 还允许明确禁止构造函数。见Offirmo's answer。

【讨论】:

注意:C++11 的规则稍有改变,声明移动构造函数或移动赋值运算符将自动阻止复制构造函数和复制赋值运算符的自动创建。这很明智,但精神不同。 @MatthieuM。 - 感谢您指出了这一点。我仍然从 C++03 的角度写作,但我应该提一下。 我不确定关于编译器何时生成构造函数的规则是否正确。默认构造函数的规则是 any 用户定义的构造函数禁止其自动生成。其他三个规则是该特定操作的用户定义版本禁止其自动生成。独立于用户可能为其他人所做的事情;如果你定义了一个默认构造函数,或者一个析构函数,你仍然会得到一个自动复制构造函数。 @James - 我澄清了我的意思 - 我的意思是你说的,而不是我写的,在二读时确实暗示编译器不会生成任何默认函数,如果它们中的任何一个是指定。【参考方案3】:

定义一个带有正确参数的构造函数。这将阻止编译器定义默认构造函数。

class X  
public:
   X(int) 
;

int main() 
    X x; // will not compile;
    X y(1); // will compile.
    return 0;

【讨论】:

【参考方案4】:

你可以在不向构造函数传递参数的情况下创建对象的原因是你有一个默认构造函数。默认构造函数是一种没有参数或所有参数都具有默认值的构造函数。如果你没有声明任何构造函数,编译器会为你创建一个。 因此,解决方案非常简单。你可以声明一个没有默认值的参数的构造函数,那么编译器就不会费心为你制作构造函数了。

【讨论】:

【参考方案5】:

创建一个私有的默认构造函数。

【讨论】:

该课程的成员和朋友仍然可以访问。最好只定义带参数的构造函数,这将完全删除隐式默认构造函数。【参考方案6】:

创建一个非空的构造函数会“取消”空的默认构造函数,所以如果你没有显式地创建一个空的构造函数,就不会在不提供参数的情况下创建任何对象。

【讨论】:

以上是关于如何禁止在 C++ 中使用默认构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中禁止复制构造函数的最可靠方法是啥?

C++如何拒绝编译器自动生成的函数

在 C++ 中使用默认构造函数

如果我们在 C++ 中重载构造函数,默认构造函数是不是仍然存在? [复制]

C++在构造函数中调用最终的虚函数

C++的默认构造函数与构造函数