C++ 中的默认构造函数
如果我的类中有带有参数的构造函数, 我们需要提供一个什么都不做的构造函数,例如:
1)
class A
{
A(){}; //To satisfy the compiler
//some constructors with parameter
};
只是为了满足编译器的要求。
现在,如果我的类有一个默认参数,例如:
2),
class A
{
//A(){} can't be used expilcilty or implicilty
A(int = 0);
};
A a;
那么调用 A::() 还是 A::A(int = 0) 就会产生歧义,因此我们无法提供任何操作- 第二种情况下没有构造函数。 那么,在这种情况下,甚至编译器提供的隐式构造函数也会受到抑制,这是真的吗?
请提供一些澄清/想法。
if i have constructors with parameters in my class,
we need to provide a do-nothing constructor like :
1)
class A
{
A(){}; //To satisfy the compiler
//some constructors with parameter
};
just to satisfy the compiler.
Now if my class has a default parameter like :
2)
class A
{
//A(){} can't be used expilcilty or implicilty
A(int = 0);
};
A a;
There is going to be an ambiguity whether to call A::() or A::A(int = 0) so we cannnot provide any do-nothing constructor in the second case.
So is it true that even the implicit constructor provided by the compiler gets suppresed in this case.
Please provide some clarification/thoughts.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
没有参数的构造函数,或者所有参数都有默认值的构造函数,是默认构造函数。
如果您提供了它,编译器将不会生成它。
如果默认构造函数对您的类型没有意义,则不必提供默认构造函数。当然,这禁止在需要默认构造函数的地方使用您的类,但这种使用可能也没有意义。
A constructor with no parameters, or a constructor where all parameters have a default value, is the default construcor.
The compiler will not generate one if you have provided it.
You don't have to provide a default constructor if that doesn't make sense for your type. Of course that prohibits the use of your class in places where a default constructor is needed, but such use probably doesn't make sense either.
如果您没有显式定义一个默认构造函数,编译器只会生成一个默认构造函数。因此,如果您定义了一个ctor,编译器将不会为该类生成一个ctor。
The compiler only generates a default ctor if you do not explicitly define one. So if you define a ctor, the compiler will not generate a ctor for the class.
如果需要显式禁用构造函数,可以将其设置为类的
私有
。请注意,编译器不应该抱怨您没有提供构造函数。当您提供一个(且仅一个)时,它应该自动停止提供默认构造函数
If you need to explicitly disable the use of a constructor, you can make it
private
to the class.Note that the compiler shouldn't be whinging about you not providing a constructor. The minute you provide one - and only one - it should automatically stop providing the default constructor