为什么代码在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就没有 展开
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就没有 展开
2个回答
展开全部
应该是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之类的函数赋值。这样就可以随意改名字了。
正确的设计应该是,
先为m_name分配缓冲区,
if(m_name==NULL)
{
m_name=new...
}
else if(长度不够)
{
销毁并重新分配足够的缓冲区
}
然后用strcpy_s之类的函数赋值。这样就可以随意改名字了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询