注册 登录
编程论坛 C++教室

new 函数问题求解!

felixzh123 发布于 2015-05-12 15:39, 476 次点击

不知道为什么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
3 回复
#2
rjsp2015-05-12 15:55
CPerson &CPerson::operator=(const CPerson &a )
{
    strcpy(this->m_pname,a.m_pname); // 你得考虑两个问题 a.是否为自身和自身的赋值 b.strcpy函数要求第一个参数指向的内存必须能容纳得下第二个参数指向的内容。
    this->m_age=a.m_age;
    return *this;
}
#3
felixzh1232015-05-12 23:12
回复 2楼 rjsp
真是太谢谢了。
终于找到原因了。
谢谢!
#4
小狼烟2015-05-13 10:27
LOL好手啊
1