【问题标题】:Will default constructor still be created if I explicitly define a constructor with arguments?如果我显式定义带参数的构造函数,是否仍会创建默认构造函数?
【发布时间】:2016-08-17 11:39:19
【问题描述】:

如果我明确定义构造函数带有参数但没有默认构造函数,是否仍会创建默认构造函数?

谢谢!

【问题讨论】:

标签: c++ constructor default


【解决方案1】:

不,在这种情况下,您必须显式提供默认构造函数。

虽然您可以(从 C++11 开始),但对于 Foo 类,使用语法

Foo() = default;

在类声明中重新引入编译器生成的默认构造函数。 (请注意,您需要将其放在 public 部分中以获得完全等效)。

或者,如果您为所有构造函数参数提供默认参数,那么它成为默认构造函数。

【讨论】:

    【解决方案2】:

    不,不会,这就是您希望类用户显式提供参数的关键。

    但是,如果您对参数使用默认值,它将成为默认构造函数

    class Foo
    {
         Foo(bool flag=false);  // not a default constructor, but acts the same
    };
    

    【讨论】:

    • 其实它确实成为了默认构造函数。
    • 它实际上是一个默认构造函数。我从内存中引用标准(所以我可能有点偏离):默认构造函数是可以在没有任何参数的情况下调用的构造函数。
    • 正确。已编辑(还添加了bool 类型,那些日子python 太多了:))
    • 定义了多个构造函数 with 的情况,所有这些构造函数都被赋予了默认参数值怎么办?这是语义错误吗?
    【解决方案3】:

    没有。如果定义构造函数,则仅存在您定义的构造函数。如果要保留默认构造函数,则必须重新定义它。

    class MyClass
    {
       MyClass(){};
    .
    .
    .
    };
    

    【讨论】:

    • 请考虑 = default 符号。
    • 这也是一种选择。但仅从 C++11 开始可用。
    • 我希望人们默认使用最新的标准。因此,不要说“这是你可以做的。哦,顺便说一下,自从 c++11 以来,你也可以这样做”,而是说“这是你可以做的。在 c++11 之前,你必须这样做”
    • @bolov 同意了,但是为什么我们每次都必须输入-std=c++11?它也应该是默认的(我是 C++ 11 的新手,但我喜欢它,而且我学得很快)
    • @bolov 不幸的是,有很多很多基于 c++98 的遗留系统。但我完全同意。另一个问题是,程序员已经习惯了旧的 c++,以至于他们甚至都懒得去查看最新标准中的新内容......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多