【问题标题】:constructor with one, default argument带有一个默认参数的构造函数
【发布时间】:2011-07-18 14:53:31
【问题描述】:

我搜索了但找不到答案。

所以我有我的 c++ 构造函数:

MyClass(string username = "something");

注意这是我唯一的构造函数。

在我的主要,我做:

MyClass one();
MyClass two = MyClass();

这两个表达式是等价的吗?编译器会用默认字符串调用我的构造函数,还是会调用默认(空)构造函数?

如果我确实有一个构造函数 MyClass(); 会发生什么变化; ?我猜那不会编译,对吧?

【问题讨论】:

标签: c++ constructor default-value default-constructor


【解决方案1】:

MyClass one();

这声明了一个函数 one 返回一个 MyClass 对象并且不接受任何参数。

如果你同时拥有默认构造函数(MyClass() 形式)和默认参数构造函数(MyClass(string s = "string") 形式),如果你不传递任何参数,会调用哪一个?

例如这不会编译

class MyClass
{
  public:
   MyClass(std::string username = "something") {}
   MyClass(){}
};

int main()
{
   MyClass one();
   MyClass two = MyClass(); //ambiguous call here
}

【讨论】:

  • 另外,two = MyClass() 将无法编译,因为缺少类型。
  • @Jon :我假设他以某种方式错过了类型。
  • 除非之前在该函数中声明过,或在类中定义过。就其本身而言,你是对的。
  • @Prasoon:我知道——这只是为了回答的完整性。
  • "你不能在一个类中同时定义默认构造函数和默认参数构造函数。"这是不正确的。这有点不正确:OP 示例中的两个构造函数都是默认构造函数,是的,您可以拥有两个或多个。这使得实际上不可能调用没有正式参数的那个,但是可以在那里使用它。请更正。
【解决方案2】:

它会调用你的构造函数。如果您自己定义构造函数——任何构造函数,无论参数数量如何——编译器都不会生成默认构造函数。

[edit] 正如 Prasoon Saurav 所说,MyClass one(); 声明了一个函数。你想要MyClass one;,注意:没有括号。

【讨论】:

    【解决方案3】:

    表达式将具有相同的净效应,但并不严格等价。第一个在one 上调用您的构造函数。第二个构造一个临时对象,然后将其分配给two,从而调用该类的复制构造函数。

    【讨论】:

    • 虽然可以优化复制构造函数调用,但它仍然必须是可访问的。
    【解决方案4】:
    MyClass one;
    MyClass two = MyClass();
    

    如果是这个意思,那么onetwo 将调用同一个构造函数,它恰好是你的构造函数,而它恰好是唯一的构造函数。

    【讨论】:

      【解决方案5】:

      这两个表达式是否等价?

      它们不相等。

      MyClass one();

      是函数one(),返回MyClass。

      如果要声明MyClass的对象,应该是:

      我的班级一;

      MyClass one = MyClass();

      提问:

      编译器会用默认字符串调用我的构造函数,还是 它会调用默认(空)构造函数吗?

      如果你声明自己的构造函数,编译器永远不会生成默认构造函数,那么现在就没有默认构造函数了。例如:

      MyClass(string username); // declare constructor take 1 parameter
      MyClass three; // error, no matching constructor
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 2012-06-30
        • 1970-01-01
        • 2015-01-28
        • 2012-12-08
        相关资源
        最近更新 更多