我对于关于它为什么调用第一个构造函数的程序感到困惑。
class A
{
public:
A(const char *c="\0")
{
cout<<"Constructor without arg";
}
A(string c)
{
cout<<"New one";
}
};
int main()
{
A a="AMD";
return 0;
}
输出是
Constructor without arg
答案 0 :(得分:8)
"AMD"
是const char[]
,隐式转换为const char*
,因此第一个构造函数[A(const char *c="\0")
]是最佳匹配。
请注意,A(const char *c="\0")
不是没有参数的构造函数,它是一个构造函数,它将一个const char*
作为参数,并具有可选的默认值在未指定const char*
时使用。在这种情况下,您传递了const char*
,因此它会使用它。
答案 1 :(得分:1)
因为字符串文字的类型为const char[]
,它隐式转换为const char*
,这比用户定义的转换std::string(const char*)
更受欢迎(这实际上不是{{1}的签名构造函数,但足以解释这个问题)。
另外:初始化不是赋值。这就是为什么首先调用构造函数而不是string
。
C ++ 11中赋值的首选语法是operator=
。它使事情更加统一。
答案 2 :(得分:0)
你用const char *调用构造函数,因为那就是“AMD”。这不是一个字符串。如果你把A a(字符串(“AMD”))它会起作用。