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

时间:2011-11-09 16:25:28

标签: c++ object constructor

我不希望在我的程序中创建一个对象而不将参数传递给构造函数。

有办法吗?

6 个答案:

答案 0 :(得分:20)

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

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

  • 默认没有参数构造函数
  • 默认析构函数
  • 复制构造函数
  • 赋值运算符

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

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

答案 1 :(得分:18)

虽然其他答案都是正确的,但在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 :(得分:6)

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

class X { 
public:
   X(int) {}
};

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

答案 3 :(得分:2)

您可以创建对象而不将参数传递给构造函数的原因是您有一个默认构造函数。默认构造函数是一种构造函数,它没有参数或所有参数都有默认值。如果您没有声明任何构造函数,编译器将为您创建一个。 所以,解决方案非常简单。您可以使用没有默认值的参数声明构造函数,然后编译器就不会费心为您创建构造函数。

答案 4 :(得分:1)

创建非空构造函数“取消”空的默认构造函数,因此如果您没有显式创建空构造函数,则不会在不给出参数的情况下创建任何对象。

答案 5 :(得分:0)

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