首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"const char *“类型的默认参数与"char *”类型的参数不兼容

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

Stack Overflow用户
提问于 2019-04-19 02:31:52
回答 3查看 19.3K关注 0票数 5

所以我从我的老师那里得到了这段代码,但它不能与其他代码结合使用,它只有在项目中单独存在的情况下才能工作。整个代码运行得很好,除了这一部分

"Notes“是另一个完美工作的类。

代码语言:javascript
复制
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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-19 02:34:49

根据编译器的不同,可能会在只读内存中分配C样式的字符串文字。因此,它们是const char[N+1] (__N是字符串长度)(由于数组到指针的衰减,它可以隐式转换为const char* )。

您遇到的问题是删除const限定符是非法的(臭名昭著的const_cast或等效的C风格类型转换除外)。

由于您仅从sir读取数据,因此可以通过将sir设置为const char*来解决此问题,这并不违反const

代码语言:javascript
复制
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);
}
票数 6
EN

Stack Overflow用户

发布于 2019-04-19 02:48:52

关于string literals

在C中,字符串文字是char[]类型,可以直接赋值给(非常量)char*。C++03也允许这样做(但不赞成这样做,因为C++中的文字是常量)。C++11不再允许在没有类型转换的情况下进行此类赋值。

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

解决方法:

  • 使用char const *作为参数的类型。这是不修改字符串时的合理解决方案(为什么要修改字符串literal??)
  • Not推荐的。当您需要写入该指针时:将字符串文字存储为(非常量) char[]并引用它(的副本)。问题:线程安全;副作用;为什么要使用this??
  • Better.如果需要写入/更改字符串:使用std::string.
票数 3
EN

Stack Overflow用户

发布于 2021-06-29 00:52:14

以下是错误版本

代码语言:javascript
复制
print_results("C = ", c);

以下是已解决的版本

代码语言:javascript
复制
print_results((char*)"C = ", c);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55751920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档