new 函数问题求解!
不知道为什么strlen后面要加上5.。。。我试了很多值,发现只有在strlen后加上5以上的数,程序才不会出错。。
谁能告诉我为什么啊,,谢谢了。
下面是我不能理解的函数
//=============================默认构造函数==============================
CPerson::CPerson(const char* name="无名",int age=0)
{
m_pname=new char[strlen(name)+5];
strcpy(m_pname,name); //copy会copy'\0'
m_age=age;
}
//=============================拷贝构造函数==============================
CPerson::CPerson(const CPerson& person)
{
m_pname=new char[strlen(person.m_pname)+5];
strcpy(m_pname,person.m_pname);
m_age=person.m_age;
}
===================================================================================================================================================
以下是我写的全部代码
#include<iostream>
#include<iomanip>
#include<vector>
#include<string>
#include<fstream>
#include<sstream>
#include<algorithm>
using namespace std;
class CPerson
{
private:
char *m_pname; // 姓名
int m_age; // 年龄
public:
CPerson(const char* , int); // 带默认参数值的构造函数
CPerson(const CPerson& person); // 拷贝构造函数
void print()const; // 输出信息函数
friend CPerson& operator++(CPerson& ); // 前自增运算符重载函数
friend CPerson operator++(CPerson& , int); // 后自增运算符重载函数
CPerson &operator=(const CPerson &x);
~CPerson()
{
delete []m_pname;
}
};
//==============================重载=运算符==============================
CPerson &CPerson::operator=(const CPerson &a )
{
strcpy(this->m_pname,a.m_pname);
this->m_age=a.m_age;
return *this;
}
//=============================默认构造函数==============================
CPerson::CPerson(const char* name="无名",int age=0)
{
m_pname=new char[strlen(name)+5];
strcpy(m_pname,name); //copy会copy'\0'
m_age=age;
}
//=============================拷贝构造函数==============================
CPerson::CPerson(const CPerson& person)
{
m_pname=new char[strlen(person.m_pname)+5];
strcpy(m_pname,person.m_pname);
m_age=person.m_age;
}
//===============================输出信息函数============================
void CPerson::print()const
{
cout<<setw(8)<<right<<m_pname
<<setw(3)<<right<<m_age;
}
class CStudent:public CPerson
{
char m_pid[20];
int m_grade1,m_grade2,m_grade3;
public:
CStudent(const char* ,const int age,const char *,const double,const double,const double);
CStudent(const CStudent &x); //拷贝构造函数
~CStudent(){}
double cal_aver_grade() const; //计算平均成绩
void modify_grade(const double ,const double ,const double); //修改成绩
double get_grade1(){return m_grade1;}
double get_grade2(){return m_grade2;}
double get_grade3(){return m_grade3;}
CStudent& operator=(const CStudent & );
void show();
};
//==============================重载=运算符====================================
CStudent & CStudent::operator=(const CStudent &a)
{
CPerson::operator=(a);
this->m_grade1=a.m_grade1;
this->m_grade2=a.m_grade2;
this->m_grade3=a.m_grade3;
strcpy(this->m_pid,a.m_pid);
return *this;
}
//===========================CStudent默认构造函数==========================
CStudent::CStudent(const char * name,const int age,const char *id="0",const double a=0,const double b=0,const double c=0):CPerson(name,age)
{
strcpy(m_pid,id);
m_grade1=a;
m_grade2=b;
m_grade3=c;
}
//===========================CStudent的拷贝构造函数=======================
CStudent::CStudent(const CStudent &x): CPerson(x)
{
strcpy(m_pid,x.m_pid);
m_grade1=x.m_grade1;
m_grade2=x.m_grade2;
m_grade3=x.m_grade3;
}
//===========================计算平均成绩==================================
double CStudent::cal_aver_grade() const
{
return (m_grade1+m_grade2+m_grade3)/3;
}
//============================修改成绩======================================
void CStudent::modify_grade(const double a=0,const double b=0,const double c=0)
{
m_grade1=a;
m_grade2=b;
m_grade3=c;
}
//==============================显示信息======================================
void CStudent::show()
{
CPerson::print();
cout<<right<<setw(10)<<m_pid
<<right<<setw(8)<<m_grade1
<<right<<setw(8)<<m_grade2
<<right<<setw(8)<<m_grade3<<endl;
}
void read_data(string filename,vector<CStudent> & x)
{
ifstream fin(filename);
string sname;
char id[20];
int age;
double a,b,c;
for(string s;getline(fin,s);)
{
istringstream sin(s);
sin>>id
>>age
>>sname
>>a
>>b
>>c;
CStudent temp(sname.c_str(),age,id,a,b,c);
x.push_back(temp);
}
}
//======================================输出CStudent向量信息==========================================
void print(vector<CStudent> &x)
{
for(unsigned int i=0;i<x.size();i++)
{
x[i].show();
}
}
//=================================计算平均成绩并保存到数组里==================================
void calc_avg(vector<CStudent> &x,vector<float> &aver)
{
for(int i=0;i<x.size();i++)
{
aver.push_back(x[i].cal_aver_grade());
}
}
//======================================输出double向量信息==========================================
void print(const vector<float> &aver)
{
for(unsigned int i=0;i<aver.size();i++)
{
cout<<"成绩"<<i<<"的平均成绩"<<aver[i];
cout<<endl;
}
}
void sort_student (vector<CStudent>&x )
{
for(int i=0;i<x.size();i++)
for(int j=i+1;j<x.size();j++)
{
if(x[i].cal_aver_grade()<x[j].cal_aver_grade())
{
swap(x[i],x[j]);
}
}
}
int main()
{
vector<CStudent> vec_stu;
vector<float> vec_avg_scorces;
read_data("data.txt", vec_stu);
print(vec_stu);
calc_avg(vec_stu, vec_avg_scorces);
print(vec_avg_scorces);
sort_student(vec_stu);
print(vec_stu);
return 0;
}
=======================================================以下是数据================================================================
1427406007 20 易大师 78 85 72
1427406009 19 蛮王 88 89 78
1427406011 19 金克丝 99 98 78
1427406008 19 瑞文 99 89 79
1427406021 19 二蛋子 2 5 9
1427406051 19 铁柱 14 2 5
1427406012 19 欧阳修 99 45 34
1427406066 19 天山童姥 88 77 89
1427406055 19 刘亦菲 99 99 99
1427406088 19 阿奴 100 100 100
1427406003 19 李逍遥 110 24 86