2

我对以下程序为何调用第一个构造函数感到困惑。

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

4

3 回答 3

8

"AMD"是 a const char[],它被隐式转换为const char*,因此第一个构造函数 [ A(const char *c="\0")] 是最佳匹配。

请注意,这A(const char *c="\0")不是没有参数的构造函数,它是一个将单个参数作为参数的构造函数,并且在未指定const char*a 时具有可选的默认值。const char*在这种情况下,您传递了 a const char*,因此它使用它。

于 2012-09-20T16:08:09.327 回答
1

因为字符串文字的类型const char[]是隐式转换的类型,const char*而不是用户定义的转换std::string(const char*)(这不是string构造函数的真正签名,但足以解释此解释)。

另外:初始化不是赋值。这就是为什么首先调用构造函数而不是构造函数的原因operator=

C++11 中赋值的首选语法是A a{"ASDF"};. 它使事情更加统一。

于 2012-09-20T16:08:52.293 回答
0

您使用 const char * 调用构造函数,因为这就是“AMD”。它不是一个字符串。如果你把 A a(string("AMD")) 它会工作。

于 2012-09-20T16:08:44.397 回答