2019 C++期末考试
总结
派生类的构造函数,在对数据成员初始化时应使用初始化列表,否则会出现没有默认构造函数的错误
CTeacher(string name, int age, string gender, string subject, int teaching_age): CPerson(name, age, gender), m_subject(subject), m_teaching_age(teaching_age);
可以声明重载<<运算符函数这种不能为成员函数(第一个操作数不是类的对象)的函数为友元函数,便于获取非公有数据,以提高运行效率
friend ostream& operator<<(ostream& out, CTeacher teacher);
重载流插入运算符<<函数应声明类型为输出流对象的引用,并提供一个输出流对象的引用作为第一个参数,这样便于类似
cout << 对象1 << 对象2
的连用重载后置++时要提供一个int形参以区别于前置++
int operator++(int);
将字符串转为某一类型的数据可以使用以下函数模板(在本题中是不必须的,因为要转换成对数据类型都是int):
template<class T> inline T str_cast(const string& str) { //将字符串转为T类型数据 istringstream is(str); T result; is >> result; return result; }
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分。