c ++函数参数char指针和字符串

时间:2012-02-19 11:00:51

标签: c++ function parameter-passing

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*参数注释掉函数时,会调用另一个函数?

4 个答案:

答案 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 *。

的字符串构造函数创建一个字符串

http://www.cplusplus.com/reference/string/string/string/

答案 3 :(得分:0)

默认情况下,“ASDADS”由char指针引用。所以使用了第二版的callme()。如果这是注释,编译器将尝试将其与字符串匹配,因此使用第一版的callme()。