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

Deb*_*ger 21 c++ constructor object

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

有办法吗?

wkl*_*wkl 23

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

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

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

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

编辑:请注意,此信息适用于C++ 03,但在C++ 11中它与Matthieu M.在评论中提到的不同.C++ 11还允许明确禁止构造函数.见Offirmo的回答.

  • 注意:规则改变了一点C++ 11,声明移动构造函数或移动赋值运算符将自动阻止自动创建复制构造函数和复制赋值运算符.这是明智的,但却是一种不同的精神. (2认同)

Off*_*rmo 22

虽然其他答案都是正确的,但在C++ 11中有一种新技术用于表达:删除默认构造函数

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

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;
}
Run Code Online (Sandbox Code Playgroud)


Jer*_*fin 7

使用正确的参数定义构造函数.这将阻止编译器定义默认构造函数.

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

int main(){ 
    X x; // will not compile;
    X y(1); // will compile.
    return 0;
}
Run Code Online (Sandbox Code Playgroud)