【发布时间】:2011-12-25 11:14:17
【问题描述】:
我不想在我的程序中创建一个对象而不向构造函数传递参数。
有办法吗?
【问题讨论】:
标签: c++ object constructor
我不想在我的程序中创建一个对象而不向构造函数传递参数。
有办法吗?
【问题讨论】:
标签: c++ object constructor
虽然其他答案都是正确的,但 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;
}
【讨论】:
当您声明任何其他构造函数时,编译器不会为您生成默认构造函数。如果你已经指定了一个默认的无参数构造函数,你可以将其设为私有。
请记住,编译器可以为一个类自动生成这 4 个成员函数中的每一个。
但是如果你自己声明了一个,它不会生成一个默认的,也就是说,如果你自己声明了一个构造函数,它不会创建默认的构造函数。如果您没有声明其他 3 个中的任何一个,编译器可以生成它们。
edit:请注意,此信息适用于 C++03,但在 C++11 中有所不同,正如 Matthieu M. 在 cmets 中提到的那样。 C++11 还允许明确禁止构造函数。见Offirmo's answer。
【讨论】:
定义一个带有正确参数的构造函数。这将阻止编译器定义默认构造函数。
class X {
public:
X(int) {}
};
int main(){
X x; // will not compile;
X y(1); // will compile.
return 0;
}
【讨论】:
你可以在不向构造函数传递参数的情况下创建对象的原因是你有一个默认构造函数。默认构造函数是一种没有参数或所有参数都具有默认值的构造函数。如果你没有声明任何构造函数,编译器会为你创建一个。 因此,解决方案非常简单。你可以声明一个没有默认值的参数的构造函数,那么编译器就不会费心为你制作构造函数了。
【讨论】:
创建一个私有的默认构造函数。
【讨论】:
创建一个非空的构造函数会“取消”空的默认构造函数,所以如果你没有显式地创建一个空的构造函数,就不会在不提供参数的情况下创建任何对象。
【讨论】: