2

不编译的行和编译的行有什么区别?不编译的行给出了这个警告: 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

}
4

3 回答 3

1

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

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

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

Student(char const name[]);

这又是一样的

String(char const *name);

虽然你最好使用std::string

#include <string>

class String
{
    public:
        String(std::string name);
};
于 2013-06-19T23:50:52.200 回答
1

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

从 C++ 标准:

普通字符串文字具有“ n const char 数组”类型和静态存储持续时间

于 2013-06-19T23:53:03.390 回答
0

字符串

"Kacy"

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

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

 Student(const char *nmae)

您可以将其用作:

 Student stud("Kacy");

就像这样:

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

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

于 2013-06-19T23:52:11.780 回答