1

我搜索但找不到答案。

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

MyClass(string username = "something");

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

在我的主要,我做:

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

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

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

4

5 回答 5

4

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
}
于 2011-03-19T04:30:11.323 回答
2
MyClass one;
MyClass two = MyClass();

如果这是当时的意思,one并且two将调用相同的构造函数,它恰好是你的构造函数,它恰好是唯一的构造函数。

于 2011-03-19T06:47:35.320 回答
0

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

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

于 2011-03-19T04:31:00.913 回答
0

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

于 2011-03-19T04:31:58.717 回答
0

这两个表达式是等价的吗?

它们不是等价的。

我的类一个();

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

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

我的班级一;

或者

我的班级一 = 我的班级();

提问:

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

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

MyClass(string username); // declare constructor take 1 parameter
MyClass three; // error, no matching constructor
于 2019-04-16T15:50:17.403 回答