2019 C++期末考试

原题链接
gitee Code-ZH_Cpp/Study/2019CppTest (Gitee)

总结

  1. 派生类的构造函数,在对数据成员初始化时应使用初始化列表,否则会出现没有默认构造函数的错误

    CTeacher(string name, int age, string gender, string subject, int teaching_age): CPerson(name, age, gender), m_subject(subject), m_teaching_age(teaching_age);
  2. 可以声明重载<<运算符函数这种不能为成员函数(第一个操作数不是类的对象)的函数为友元函数,便于获取非公有数据,以提高运行效率

    friend ostream& operator<<(ostream& out, CTeacher teacher);
  3. 重载流插入运算符<<函数应声明类型为输出流对象的引用,并提供一个输出流对象的引用作为第一个参数,这样便于类似 cout << 对象1 << 对象2 的连用

  4. 重载后置++时要提供一个int形参以区别于前置++

    int operator++(int);
  5. 将字符串转为某一类型的数据可以使用以下函数模板(在本题中是不必须的,因为要转换成对数据类型都是int):

    template<class T>
    inline T str_cast(const string& str) {    //将字符串转为T类型数据
        istringstream is(str);
        T result;
        is >> result;
        return result;
    }
  6. getline函数接受三个参数,第一个是输入流类对象(从中读取),第二个是要接受结果的字符串,第三个是分隔符(在结果中不包含,默认是'\n'

    例如 下面的代码实现了从一个字符串中提取姓名、年龄等信息的功能:

    //teacher为有上面五个信息的长字符串,格式符合题目要求
    istringstream readFromString(teacher);
    string name, s_age;                //s_age用于暂时保存age字符串,方便以后的转换
    int age;
    getline(readFromString, name, '\t');
    getline(readFromString, s_age, '\t');
    age = str_cast<int>(s_age);        //转换
    //……

题目

详见Gitee链接

按以下要求编写程序

现有数据文件teacher.txt和源程序文件main.cpp。

文件teacher.txt中存储了若干教师的基本信息,一行存储了一位教师的信息,存储格式如下所示(每行中的各项之间以制表符'\t'进行分隔。斜线文字和线条是用于对文件格式进行解释说明的,在文件中并不存在。):

教师姓名 年龄 性别 所教课程 教龄
Tom 30 Male Math 2
Mike 45 Female Physics 13
……

基类说明

现有CPerson类描述如下:

class CPerson
{
    string        m_name;                    //姓名
    int            m_age;                    //年龄
    string        m_gender;                //性别
public:
    CPerson(string name, int age, string gender)        //构造函数
    {
        m_name        = name;
        m_age        = age;
        m_gender    = gender;
    }
    string getName()    const            //获取姓名
    {
        return m_name;
    }
    int getAge()    const                //获取年龄
    {
        return m_age;
    }
    string getGender()    const            //获取性别
    {
        return m_gender;
    }
};

派生类说明

请以CPerson类为基类进行公有继承,派生出CTeacher类用于描述教师。

CTeacher类在继承姓名、年龄和性别的基础上,还需要添加两个私有成员用于描述教师所教课程和教龄,成员定义代码如下:

string   m_subject;
int      m_teaching_age;
  • 为CTeacher类添加一个构造函数。构造函数通过5个形式参数对教师对象的5个成员分别进行初始化。

  • 为CTeacher类添加后自增运算符++。++运算符用于将教师对象的教龄加1。

  • 为CTeacher重载流输出运算符<<,使得用户可以通过 cout<< 输出教师对象的数据。各项之间通过制表符'\t'分隔。

  • 可根据实际需要,添加其它成员函数或友元函数。

程序业务流程说明

  • 从数据文件teacher.txt中读取数据,逐个生成CTeacher类的对象,并将这些对象存储到vector对象myVect中,并按照上述格式显示这些教师信息。

  • 对所有教师对象执行后自增运算,将自增运算后教龄满30年的教师对象添加到myVectNew中。

  • 将myVectNew中按上述格式输出在屏幕上。

编程要求

  • 根据业务流程和main.cpp中的注释,在main.cpp的基础上将程序补充完整。

  • 不可以修改CPerson类的代码。每修改一处编程题总得分扣2分,最多扣6分。

  • 不可以修改main函数的代码。每修改一处编程题总得分扣2分,最多扣6分。