【问题标题】:char pointers, char arrays, and strings in the context of a function call函数调用上下文中的 char 指针、char 数组和字符串
【发布时间】:2013-06-19 23:47:40
【问题描述】:

不编译的行和编译的行有什么区别? 不编译的行给出了这个警告:deprecated conversion from string constant to 'char*'

另外,我知道在传递给函数的字符串上强制转换 (char *) 可以解决问题,但我想了解为什么当第二行编译得很好时,这甚至是必要的。

class Student {

  public:

    Student( char name[] ) {

    }

}

int main() {

  Student stud( "Kacy" ); //does not compile
  char name[20] = "Kacy";   //compiles just fine

}

【问题讨论】:

    标签: c++ string arrays char-pointer


    【解决方案1】:

    参数中的char[]签名与char*完全相同。在 C++ 中,将字符串常量 char const*(字符串 "Kacy")转换为 char* 是非法的,因为字符串是不可变的。

    您的第二个示例可以编译,因为 name 是一个实际数组。 char* 没有变化。

    作为一种解决方案,将您的参数更改为采用 const 字符串数组:

    Student(char const name[]);
    

    又是一样的

    String(char const *name);
    

    虽然你最好使用std::string:

    #include <string>
    
    class String
    {
        public:
            String(std::string name);
    };
    

    【讨论】:

    • '隐式转换'有点不准确,恕我直言。没有转换,它们实际上是相同的。 char name[] 只是 char *name 的语法糖。
    • @CarlNorum 是的,你是对的。正在考虑别的事情。
    • 没问题,只是想澄清一下。
    • 好的,我想我明白你在说什么。这两行之间的主要区别是 char name[] 是 char* 而 char name[20] 是数组而不是指针这一事实吗?
    • @KacyRaye 不,当在参数列表中使用时,数组类型T[N] 在功能上等同于T*。这并不是说它们通常是等价的。当在主函数中使用T[N] 时,它代表一个数组,T* 代表一个指向T 的指针。
    【解决方案2】:

    C++ 字符串文字的类型为“n const char 数组”,在您的用例中衰减为const char *。您尝试的到char * 的隐式转换(即丢弃const)已被弃用,因此会出现警告。更改构造函数签名中的类型或进行显式 const-cast。

    来自 C++ 标准:

    一个普通的字符串字面量具有类型“n const char的数组”和静态存储时间

    【讨论】:

      【解决方案3】:

      字符串

      "Kacy"
      

      不是编译器生成代码时的字符数组。相反,它会将字符串“Kacy”存储在内存中的某个位置,并生成指向该位置的指针。所以你得到的是一个const char * 指向字符串“Kacy\0”。

      如果您将构造函数更改为:

       Student(const char *nmae)
      

      你可以同时使用它:

       Student stud("Kacy");
      

      就像这样:

       char name[20] = "Kacy"; 
       Student stud2(name);
      

      请注意,编译器将生成代码以使用"Kacy" 中的字符填充数组name,这与仅使用"Kacy" 作为Student 构造函数的参数不同。

      【讨论】:

      • 字符串“Kacy”一个数组。这就是为什么它有效:const char (&amp;ref)[5] = "Kacy"; - 而这个:const char(*ptr)[5] = &amp;"Kacy";
      猜你喜欢
      • 1970-01-01
      • 2020-11-21
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      相关资源
      最近更新 更多