类型为“ const char *”的默认参数与类型为“ char *”的参数不兼容

时间:2019-04-18 18:31:52

标签: c++

所以我从老师那儿得到了这段代码,但是它不能与其他代码结合使用,只有在单独存在于项目中时,它才能起作用。整个代码效果很好,而这一部分要少

“笔记”是另一个效果很好的类

class student
{
    char name[30];
    notes marks;
public:
    student(int = 8, char* =" "); //HERE IS WHERE I GOT THE PROBLEM, AT HIS CHAR*
    ~student();
    void read_name();
    void read_marks();
    void modif_mark(int, double);
    void print();
    void check_marks();
};

/*...
  ...
  ...
*here is a lot of code working great*
  ...
  ...
  ...
*/

student::student(int nr_marks, char* sir) :
    marks(nr_marks)
{
    strcpy_s(name, sir);
}

3 个答案:

答案 0 :(得分:4)

取决于编译器,可以在只读存储器中分配C样式的字符串文字。因此它们是const char[N+1] N是字符串长度) (由于指向数组的指针衰减,它可以隐式转换为const char*

您遇到的问题是,丢弃const限定词是非法的(臭名昭著的const_cast或同等C样式转换除外)。。 >

由于您仅从sir中读取内容,因此可以通过将sir设为const char*来解决此问题,这不会违反const

class student {
...
student(int = 8, const char* =" "); // problem solved
...
};

student::student(int nr_marks, const char* sir) : // remember to change it here as well
    marks(nr_marks)
{
    strcpy(name, sir);
}

答案 1 :(得分:1)

关于string literals

  

在C中,字符串文字的类型为char[],可以分配   直接传至(非常数)char*。 C ++ 03也允许它(但是   不推荐使用,因为文字在C ++中是const)。 C ++ 11不再允许   这样的任务无需演员。

您的老师可能更精通C或“过时的” C ++。如上所述,该语言(=现代C ++)不允许从字符串文字中分配/初始化char*

解决方法:

  • 使用char const *作为参数的类型。当不修改字符串时,这是合理的解决方案(为什么要修改字符串文字?)

  • 不推荐。当您需要写入该指针时:将字符串文字(作为副本)存储为(非const)char[],然后对其进行引用。问题:线程安全;副作用;您为什么要这样做?

  • 更好。如果您需要写/更改字符串,请使用std::string

答案 2 :(得分:0)

以下是错误版本

print_results("C = ", c);

以下是已解决的版本

print_results((char*)"C = ", c);