【问题标题】:c++ function parameter char pointer and stringc++函数参数char指针和字符串
【发布时间】:2012-03-10 01:17:22
【问题描述】:
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*参数注释掉函数时,会调用另一个函数?

【问题讨论】:

  • (编辑器中有一个帮助按钮。请阅读。对于代码,选择您的代码块并单击{} 按钮或按Ctrl+K。)

标签: c++ function parameter-passing


【解决方案1】:

当您同时拥有这两个函数时,有两种选择可供选择,并且 (char *) 更适合您的论点“ASDADS”。如果您删除 (char *) 函数,那么只有一个函数需要一个字符串。因此,编译器使用带有 char * 的字符串构造函数创建一个字符串。

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

【讨论】:

    【解决方案2】:

    这是因为"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) {}
    };
    

    【讨论】:

      【解决方案3】:

      字符串字面量(如"abc")的类型是“const char 数组”。但是,作为一个特殊规则,C++ 允许(已弃用!)标准转换为char *。这种转换优于构造函数string::string(const char *) 提供的用户定义转换。因此,char* 重载在重载解决过程中获胜(char* 的用户定义转换为零,而string 的用户定义转换为 1)。

      (我实际上找不到对此的标准参考;相反,C.1.1 明确指出 char * p = "abc"; 是“在 C++ 中无效”。感谢任何进一步的输入。编辑: 看起来这是从 C++03 到 C++11 的变化,而在 C++11 中这确实是完全非法的。)

      【讨论】:

      • 我认为这是一个编译器扩展。虽然我从来没有真正明白,为什么你可以拥有char* = "foo";,但是当你尝试改变它时却遇到了UB。为什么不直接将其设为const char*
      • @LuchianGrigore:好吧,即使在 GCC 上使用-pedantic,它也会说“不推荐使用的转换”,所以听起来不像是扩展......
      • 我说的是 MSVS2008。我什至没有收到警告。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 2015-01-02
        • 1970-01-01
        相关资源
        最近更新 更多