我搜索但找不到答案。
所以我有我的 c++ 构造函数:
MyClass(string username = "something");
请注意,这是我拥有的唯一构造函数。
在我的主要,我做:
MyClass one();
MyClass two = MyClass();
这两个表达式是等价的吗?编译器会用默认字符串调用我的构造函数,还是会调用默认(空)构造函数?
如果我确实有一个构造函数 MyClass(); 会发生什么变化?? 我想这不会编译,对吧?
我搜索但找不到答案。
所以我有我的 c++ 构造函数:
MyClass(string username = "something");
请注意,这是我拥有的唯一构造函数。
在我的主要,我做:
MyClass one();
MyClass two = MyClass();
这两个表达式是等价的吗?编译器会用默认字符串调用我的构造函数,还是会调用默认(空)构造函数?
如果我确实有一个构造函数 MyClass(); 会发生什么变化?? 我想这不会编译,对吧?
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
}
MyClass one;
MyClass two = MyClass();
如果这是当时的意思,one
并且two
将调用相同的构造函数,它恰好是你的构造函数,它恰好是唯一的构造函数。
它将调用您的构造函数。如果您自己定义构造函数——无论参数数量如何的任何构造函数——编译器都不会生成默认构造函数。
[编辑] 正如 Prasoon Saurav 所说,MyClass one();
声明一个函数。你想要MyClass one;
,注意:没有括号。
这些表达式将具有相同的净效应,但并不严格等效。第一个调用你的构造函数one
。第二个构造一个临时对象,然后将其分配给two
,从而调用该类的复制构造函数。
这两个表达式是等价的吗?
它们不是等价的。
我的类一个();
它是函数 one(),返回 MyClass。
如果要声明 MyClass 的对象,应该是:
我的班级一;
或者
我的班级一 = 我的班级();
提问:
编译器会用默认字符串调用我的构造函数,还是会调用默认(空)构造函数?
如果你声明自己的构造函数,编译器永远不会生成默认构造函数,那么现在就没有默认构造函数了。例如:
MyClass(string username); // declare constructor take 1 parameter
MyClass three; // error, no matching constructor