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

#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就没有
最新回答
我走开你没负累

2024-12-02 04:35:43

应该是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之类的函数赋值。这样就可以随意改名字了。
↗雾里↖看花☆

2024-12-02 00:34:44

把函数声明的char* 改成const char*