为什么要调用这个构造函数?

时间:2012-09-20 16:07:05

标签: c++

我对于关于它为什么调用第一个构造函数的程序感到困惑。

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

3 个答案:

答案 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”))它会起作用。