C++语言是面向对象的语言,它可以相当方便并且十分有效地帮你达到目的。与C相比,C++定义了类这种对象的组织形式,提供了程序在不同部分之间更好的共享数据及进行函数控制的方法。封装不仅提供了更大范围的控制,而且使得在源代码中公有/私有区别更加清晰。多态完成了分散化控制,重载(函数重载、运算符重载)实现了使用同一运算符实现不同功能,使得程序更简便。
以下列程序的实现为例具体说明。
学校人员信息管理程序,管理学生和教师的基本信息。程序完成功能:
(1) 分类浏览 (2) 增加(3) 查询 (4)输出到文件(5)其他
要求:
1、定义一个学生类Student。需要存储每个学生的姓名、学号、性别等信息。定义教师类Teacher,存储每个教师的编号、姓名、性别、职称等信息。定义抽象类Person,保存人员的基本信息,如姓名、性别等。定义一个班级类Class,每个学生在一个班级中学习,每个教师负责多个班级的教学辅导。
2、定义各类的成员函数:分别实现获取、修改信息等相关操作。
3、通过在基类Person建立纯虚函数,实现按姓名输出教师或学生的信息。
4、重载流提取运算符,使能对Student类的对象进行输出操作。
5、根据需要,适当添加其他必要的数据成员和成员函数,如构造函数、拷贝构造函数、析构函数、运算符重载,按学号或姓名排序等。
分析:
学校人员包括学生和教师,学生和教师都应该储存姓名、性别、年龄、身份证号码等基本信息,初步可以建立三个类,可建立抽象类Person,用于实现姓名、性别、身份证号码、电话等基本信息的储存。学生与教师的区别在于学生有学号,只有一个所在班级,而教师有职称,编号,每个教师会负责多个班级。定义学生类Student,继承Person类的功能,增加学生的学号、所在班级、宿舍号;定义教师类Teacher,继承Person类的基本功能,增加教师的编号、职称。另外需定义一个班级类Class,每个学生属于一个班级,可用一个成员函数X实现,一个教师负责多个班级的教学辅导,可用成员函数Y来实现。学生类Student继承班级类Class,访问其成员函数Y,教师类Teacher继承班级类Class,访问其成员函数Y。
学校人员信息管理不仅包括各种信息的储存,还要做到每个人的信息都可以输出,可以根据姓名或者学号、编号查找到他的其它各种信息。学校成员会变动,学生增加,教师增加,所以各种信息也相应增加。人员的信息也会存在变动,比
如学生转专业,班级变动;教师负责的班级变动。整体需设计四个模块,模块一用于将储存的信息输出,模块二用于查找人员信息,模块三用于增加新成员的信息,模块四用于修改人员信息。
类的实现
下面是Person ,Class ,Student ,Teacher,三个类的声明
//定义一个表示人的类Person
class Person
{
public: //外部接口
Person(); //Person类的构造函数
//下面的display为虚函数,用于多态
virtual void display(void); //此函数用于显示类中的成员
void SetAge(int); //用于设置人的年龄
void SetName(char *); //用于设置人的姓名
void SetSex(bool); //用于设置人的性别
protected:
int m_age; //此成员变量用于保存人的年龄
char m_name[32]; //保存人的姓名
bool m_sex; //保存人的性别,true为男,false为女};
//定义一个表示班级的类Class
class Class
{
public:
Class();
Void SetClass(int); //用于设置学生的班级
Void SetClasses(int); //用于设置教师负责的班级
protected:
char m_name[32];
}
//定义一个Student类,该类是从Person类继承过来的
class Student:public Person,public Class
{
public: //外部接口
Student(); //Student 的构造函数
virtual void display(void); //用于显示类中的成员
void SetStdNO(char *); //设置学号
void SetClass(int); //继承Class类,设置班级
private:
char m_stdNO[32]; //保存学号
};
//定义一个teacher类,该类也是从person类继承过来的
class Teacher:public Person
{
public: //外部接口
Teacher(); //Teacher 的构造函数
virtual void display(void); //用于显示类中的成员
void SetTTP(char *); //设置职称
void SetClasses(int); //继承Class类,设置负责班级private:
char m_TTP[32]; //保存职称
};
下面是Person ,Student ,Teacher三个类定义的实现
Person类定义的实现
//定义Person类的构造函数,在这里对成员变量进行初始化Person::Person()
{
*m_name = 0;
m_sex = true;
m_age = 0;
};
//定义Person类的打印函数,用于打印Person类的的成员信息
void Person::display()
{
cout<<"从类person中打印出来的......"< cout<<"姓名\t"<<"性别\t"<<"年龄"< cout<<"------------------------"< cout< //定义Person类的设置年龄的接口函数 void Person::SetAge(int iAge) { m_age = iAge; }; //定义Person类的设置姓名的接口函数 void Person::SetName(char * pName) { strcpy(m_name,pName); }; //定义Person类的设置姓名的接口函数 void Person::SetSex(bool blSex) { m_sex = blSex; }; Class类定义的实现 //定义Class类的构造函数,在这里对成员变量进行初始化Class::Class() { *m_name=0 }; //定义Class类的设置学生所在班级的接口函数 void Class::SetClass(int classnumber) { m_class=classnumber; } Student类定义的实现 //定义Student类的构造函数,用于初始化Student的成员变量Student::Student():Person() { m_stdNO[0]= 0; m_math = m_english = m_physics = m_chem = 0; }; //定义Student类的设置学号接口函数 void Student::SetStdNO(char * strStdNo) { strcpy(m_stdNO,strStdNo); }; //定义Student类的打印函数,用于打印Student类的成员信息 void Student::display() { cout<<"从类Student中打印出来的......"< cout<<"姓名\t"< cout< }; Teacher类定义的实现 //定义Teacher类的构造函数,在这里对成员变量进行初始化 Teacher::Teacher():Person() { *m_TTP = 0; }; //定义Teacher类的设置职称的接口函数 void Teacher::SetTTP(char * ttp) { strcpy(m_TTP,ttp); }; //定义Teacher类的打印函数,用于打印Teacher类的成员信息 void Teacher::display() { cout<<"从类teacher中打印出来的......"< cout<<"姓名\t"<<"性别\t"<<"年龄\t"<<"职称"< cout< 三、程序调试 在main函数前先定义如下三个display函数(display1、display2、display3)和三个function函数(function1、function2、function3)。display函数: void display1() {cout<<"请输入操作对象...\n"<<"(1): 老师\n"<<"(2): 学生\n"<<"(3)退出程序"< void display2() {cout<<"(1)浏览信息(显示老师信息)\n"<<"(2)增加信息\n"<<"(3)查询(按姓名)\n"<<"(4)退出对老师的操作"< void display3() {cout<<"(1)浏览信息(显示学生信息)\n"<<"(2)增加信息\n"<<"(3)查询(按姓名)\n"<<"(4)退出对学生的操作"< 这三个display函数可以对相应操作进行提示。 function函数: void function1(char who) //用于浏览信息{ char line[51]; //将信息读入到这个数组中进行处理if(who=='t') { ifstream tfile("teacher.txt",ios_base::in); //以读入方式打开teacher文件while( tfile.good() ) { tfile.getline(line,50); cout< // 将文件中的信息按行读到line数组中,最多可读入50个字符tfile.close(); } else { ifstream tfile("student.txt",ios_base::in); while( tfile.good() ) { tfile.getline(line,50); cout< //将文件中的信息按行读到line数组中,最多可读入50个字符,然后将其输出tfile.close(); } } void function2(char who) //用以增加信息 { string name,sex,bianhao,zhicheng,xuehao; char choice; if(who=='t') { ofstream tfile("teacher.txt",ios_base::app);//追加 do { teacher *t=new teacher; cout<<"请输入这位老师的姓名: ";cin>>name; t->setname(name); cout<<"请输入这位老师的性别: ";cin>>sex; t->setsex(sex); cout<<"请输入这位老师的编号: ";cin>>bianhao; t->setbianhao(bianhao); cout<<"请输入这位老师的职称: ";cin>>zhiye; t->setzhicheng(zhicheng); tfile< delete t; cout<<"继续添加吗?(N/Y) ";cin>>choice;}while(choice=='Y'||choice=='y'); tfile.close(); } else { ofstream tfile("student.txt",ios_base::app); //追加信息 do{ student *s=new student; cout<<"请输入这位学生的姓名: ";cin>>name; s->setname(name); cout<<"请输入这位学生的性别: ";cin>>sex; s->setsex(sex); cout<<"请输入这位学生的学号: ";cin>>xuehao; s->setxuehao(xuehao); tfile< delete s; cout<<"继续添加吗?(N/Y) ";cin>>choice; }while(choice=='Y'||choice=='y'); } } void function3(char who) //用以查询信息{ string name1; string n,s,x; char line[51]; char *p=NULL; char name2[10],sex[5]; int i=0; if(who=='t') { ifstream tfile("teacher.txt",ios_base::in);同上cout<<"请输入要查找的老师的姓名: "; cin>>name1; while( tfile.good() ) { tfile.getline(line,50); 同上 i=0; p=line; while(*p!=' ') {name2[i++]=*p; p++; } name2[i]='\0'; if(name1==name2) {cout< if( ! tfile.good() )cout<<"...........无此人..........,"< cout<<"请输入要查找的学生的姓名: ";cin>>name1; while( tfile.good() ) { tfile.getline(line,50); i=0; p=line; while(*p!=' ') {name2[i++]=*p; p++; } name2[i]='\0'; if(name1==name2) { n=name2; p++; i=0; while(*p!=' ') //测试重载流提取运算符 { sex[i++]=*p; p++;} sex[i]='\0'; s=sex; p++; x=p; //将学号赋给x student stu; stu.setname(n); stu.setsex(s); stu.setxuehao(x); stu.operator<<(stu); //测试重载流提取运算符 cout< if( ! tfile.good() )cout<<"..........无此人.........."< } 在main函数中,首先由display1输出操作提示信息,选择操作对象。根据用户输入操作对象的不同,由switch语句进行老师,学生,教授的分类浏览。其次,若用户选择操作对象为老师(学生),则由display2(display3)输出“浏览”、“增加”、“查询”或“退出程序”的操作提示信息,根据用户选择操作方法的不同,分别由function1、function2、function3进行浏览、添加和查询的操作。