构造函数有一个,默认参数

时间:2011-03-19 04:29:16

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

我搜索但找不到答案。

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

MyClass(string username = "something");

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

在我的主要内容中,我这样做:

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

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

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

5 个答案:

答案 0 :(得分:3)

MyClass one();

这声明了一个函数one返回一个MyClass对象并且没有参数。

如果你有默认构造函数(形式为MyClass())和默认参数constuctor(形式为MyClass(string s = "string")),如果你没有传递任何参数,那么会调用哪一个?

例如,这不会编译

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

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

答案 1 :(得分:2)

MyClass one;
MyClass two = MyClass();

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

答案 2 :(得分:0)

它会调用你的构造函数。如果您自己定义构造函数 - 任何构造函数,而不管参数的数量 - 编译器将不会生成默认构造函数。

[编辑]正如Prasoon Saurav所说,MyClass one();宣布了一个功能。你想要MyClass one;,注意:没有括号。

答案 3 :(得分:0)

表达式具有相同的净效果,但并不完全等效。第一个调用one上的构造函数。第二个构造一个临时的,然后将它分配给two,从而调用该类的复制构造函数。

答案 4 :(得分:0)

  

这两个表达式是否相等?

它们不是等效的。

  

MyClass one();

它是函数one(),返回MyClass。

如果要声明MyClass的对象,则应为:

  

MyClass一;

  

MyClass一个= MyClass();

问题:

  

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

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

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