为什么代码在vc++6.0能运行,在VS2017不能呢?

#include<iostream>usingnamespacestd;//类的声明classStudent{private://私有的char*m_name;intm_... #include <iostream>
using namespace std;

//类的声明
class Student {
private: //私有的
char *m_name;
int m_age;
float m_score;

public: //共有的
void setname(char *name);
void setage(int age);
void setscore(float score);
void show();
};

//成员函数的定义
void Student::setname(char *name) {
m_name = name;
}
void Student::setage(int age) {
m_age = age;
}
void Student::setscore(float score) {
m_score = score;
}
void Student::show() {
cout << m_name << "的年龄是" << m_age << ",成绩是" << m_score << endl;
}

int main() {
//在栈上创建对象
Student stu;
stu.setname("小明");
stu.setage(15);
stu.setscore(92.5f);
stu.show();

//在堆上创建对象
Student *pstu = new Student;
pstu->setname("李华");
pstu->setage(16);
pstu->setscore(96);
pstu->show();

return 0;
}
就stu.setname("小明");和pstu->setname("李华");说“void Student::setname(char *)”: 无法将参数 1 从“const char [5]”转换为“char *” ,但是vc++6.0就没有
展开
 我来答
jiangsanhuo
2018-01-30 · TA获得超过168个赞
知道小有建树答主
回答量:291
采纳率:81%
帮助的人:171万
展开全部
应该是VS的类型检测更加严格了, 按照你的思路, m_name是char*,一般来说是可以指向一块可写的缓冲区, 而“小明”这种string是保存在静态存储区,不可写。 你可以强制转换 m_name=(char*)name; 但是这样就不安全了,不如那一天你想给名字 strcpy(m_name,"xiaoming");这样一定会出错。因为m_name实际指向不可写内存区域。
正确的设计应该是,
先为m_name分配缓冲区,
if(m_name==NULL)
{
m_name=new...
}
else if(长度不够)
{
销毁并重新分配足够的缓冲区
}
然后用strcpy_s之类的函数赋值。这样就可以随意改名字了。
Peter11119999
2020-02-12
知道答主
回答量:1
采纳率:0%
帮助的人:632
展开全部
把函数声明的char* 改成const char*
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式