多个默认构造函数

6

这个stackoverflow问题中,答案包含以下引用:

... 定义说所有默认构造函数(如果有多个)...

如何可能存在多个默认构造函数,以及为什么标准允许或有用呢?

2个回答

11

默认构造函数不一定没有参数;它们只需要可以使用零个参数来调用即可。

任何所有参数都有默认值的构造函数都满足此条件。

[class.dtor/1]: 类 X 的默认构造函数是类 X 的构造函数,其中每个非函数参数包参数都具有默认参数(包括没有参数的构造函数的情况)。[...]

struct Foo
{
   Foo(int a = 0);
   Foo(std::string str = "");
};

当然,在这个例子中,你不能使用它们中的任何一个来实例化Foo而不提供参数(调用将会是含糊的)。但是Foo仍然可用,并且这些仍然是“默认构造函数”。这只是标准为了定义规则而决定对事物进行分类的方式。它并不会真正影响你的代码或编程。

(顺便说一句,我不想分散注意力,但你应该在这两个上都加上explicit!)


你能详细说明一下在这种情况下重载解析是如何工作的吗? - Zuodian Hu
4
@ZuodianHu 不是很好 ;) - Asteroids With Wings
1
哈哈,那完全公平。 - Zuodian Hu
构造函数也可以是一个可变模板,使用函数参数包。在这种情况下,重载分辨率可以区分它们。 - walnut
3
请注意,这门课程设计得如此糟糕,以至于委员会没有必要花时间对其进行优化。 - Asteroids With Wings

2

这是一个具有两个默认构造函数的类的示例,可以进行默认构造:

struct Foo
{
    Foo(); // #1

    template <class... Args>
    Foo(Args...); // #2
};

auto test()
{
    Foo f{}; // ok calls #1
}

是因为在重载解析过程中,模板函数不太受青睐吗? - LRDPRDX

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