void callme(string a)
{
cout<<"STRING CALLED"<<endl;
}
void callme(char * a)
{
cout<<"char pointer called"<<endl;
}
int main()
{
callme("ASDADS");
return 0;
}
为什么会调用char*
?为什么当我用char*
参数注释掉函数时,会调用另一个函数?
答案 0 :(得分:4)
那是因为"ASDADS"
可转换为char *
。因此编译器为第一个函数生成代码,它可以匹配参数。
如果使用char *
删除原型,编译器将查找接受带有从char *
到参数类型的隐式转换的参数的函数。
以下面的例子为例:
class A
{
public:
A() {}
A(int x) {}
};
//void foo(int x) {}
void foo(A x) {}
int main(int argc, char* argv[])
{
int x = 3;
foo(x);
}
如果您注释掉foo(int x)
,则会调用另一个函数。
但是,如果将构造函数声明为explicit
,则会出错:
class A
{
public:
A() {}
explicit A(int x) {}
};
答案 1 :(得分:3)
字符串文字的类型(如"abc"
)是“const char数组”。但是,作为一项特殊规则,C ++允许(不推荐使用!)标准转换为char *
。这种转换优于构造函数string::string(const char *)
提供的用户定义转换。因此,char*
重载在重载解析期间获胜(char*
的用户定义转换为零,而不是string
的一个用户定义转换。
(我实际上无法为此找到标准参考;相反,C.1.1明确表示char * p = "abc";
在C ++中“无效”。任何进一步的输入都值得赞赏。编辑:< / em>看起来这是从C ++ 03到C ++ 11的变化,而在C ++ 11中,这确实是非常违法的。)
答案 2 :(得分:0)
当你有这两个函数时,有两个选择可供选择,而(char *)更适合你的参数“ASDADS”。如果删除(char *)函数,则只有一个函数需要字符串。因此,编译器使用带有char *。
的字符串构造函数创建一个字符串答案 3 :(得分:0)
默认情况下,“ASDADS”由char指针引用。所以使用了第二版的callme()。如果这是注释,编译器将尝试将其与字符串匹配,因此使用第一版的callme()。