我搜索但找不到答案。
所以我有我的c ++构造函数:
MyClass(string username = "something");
请注意,这是我唯一的构造函数。
在我的主要内容中,我这样做:
MyClass one();
MyClass two = MyClass();
这两个表达式是等价的吗?编译器是用默认字符串调用我的构造函数,还是要调用默认的(空)构造函数?
如果我有一个构造函数MyClass(),会有什么变化; ?我想那不会编译,对吧?
答案 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();
如果这是意思,那么one
和two
将调用相同的构造函数,这恰好是您的构造函数,它恰好是唯一的构造函数。
答案 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