带有一个默认参数的构造函数

7
假设我有一个类:
class C {
       C(int a=10);
};

为什么我调用时

C c;

构造函数C(int =10)被调用,如果我调用

C c();

默认构造函数被调用了?如何避免这种情况?我只想执行我的构造函数,我尝试将默认构造函数设为私有,但它并没有起作用。


3
你可以提供一段可编译的代码,展示你认为出现的行为吗?从到目前为止的答案中可以看出,你所描述的不是代码应该做的事情。 - sbi
提醒一下,自 Visual Studio 2003 起,MSVC 将对此问题提供警告:“warning C4930: 'C c(void)':原型函数未被调用(是否意图定义变量?)”。其他编译器也会发出类似警告,但我目前可以轻松使用的编译器都没有。 - Michael Burr
3个回答

17
  1. 实际上,C c(); 应该解析为一个函数声明。如果想要显式调用默认构造函数,你需要写成 C c = C();
  2. 一旦你定义了任何构造函数,编译器将不会提供默认构造函数,因此无法调用。
  3. 由于你的构造函数可以使用一个参数进行调用,它作为一个隐式转换函数。你应该考虑使其explicit,以避免在意想不到的时刻发生隐式转换。

14

代码 C c(); 并不是你想的那样:

它声明了一个名为c的函数,该函数不带参数并返回一个 C 类型。它等同于:

C c(void);

重要的是它在运行时不执行任何操作。 - Michael Burr

1
这是因为c()被解释为名为c的函数。C()将触发C类的适当构造函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接