《C++面向对象程序设计》习题答案

更新时间:2024-05-04 00:11:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《C++程序设计》

习题解答

1

目录

第2部分 习题解答 .................................................................................................................................. 2

第1章 面向对象程序设计概述 ...................................................................................................... 2 第2章 面向过程程序设计 ............................................................................................................ 12 第3章 类和对象 ............................................................................................................................ 18 第4章 继承与派生 ........................................................................................................................ 24 第5章 多态性与虚函数 ................................................................................................................ 33 第6章 友元与静态成员 ................................................................................................................ 37 第7章 运算符重载 ........................................................................................................................ 41 第8章 泛型编程 ............................................................................................................................ 50 第9章 输入/输出 ........................................................................................................................... 55 第10章 异常处理 .......................................................................................................................... 61

I

第2部分 习题解答

第1章 面向对象程序设计概述

一、简答题

简述面向过程程序设计和面向对象程序设计的编程思想,体会面向对象程序设计的优点。 【答案要点】

面向过程程序设计的编程思想:功能分解、逐步求精、模块化、结构化。当要设计一个目标系统时,首先从整体上概括出整个系统需要实现的功能,然后对系统的每项功能进行逐层分解,直到每项子功能都足够简单,不需要再分解为止。具体实现系统时,每项子功能对应一个模块,模块间尽量相对独立,通过模块间的调用关系或全局变量而有机地联系起来。

面向对象程序设计的编程思想:

(1)客观世界中的事物都是对象(object),对象之间存在一定的关系。

(2)用对象的属性(attribute)描述事物的静态特征,用对象的操作(operation)描述事物的行为(动态特征)。

(3)对象的属性和操作结合为一体,形成一个相对独立、不可分的实体。对象对外屏蔽其内部细节,只留下少量接口,以便与外界联系。

(4)通过抽象对对象进行分类,把具有相同属性和相同操作的对象归为一类,类是这些对象的抽象描述,每个对象是其所属类的一个实例。

(5)复杂的对象可以用简单的对象作为其构成部分。

(6)通过在不同程度上运用抽象的原则,可以得到一般类和特殊类。特殊类继承一般类的属性与操作,从而简化系统的构造过程。

(7)对象之间通过传递消息进行通信,以实现对象之间的动态联系。 (8)通过关联表达类之间的静态关系。

与传统的面向过程程序设计相比,面向对象程序设计的优点如下:

(1)从认识论的角度看,面向对象程序设计改变了软件开发的方式。软件开发人员能够利用人类认识事物所采用的一般思维方式来进行软件开发。

(2)面向对象程序中的数据的安全性高。外界只能通过对象提供的对外接口操作对象中的数据,这可以有效保护数据的安全。

(3)面向对象程序设计有助于软件的维护与复用。某类对象数据结构的改变只会引起该类对象操作代码的改变,只要其对外提供的接口不发生变化,程序的其余部分就不需要做任何改动。面向对象程序设计中类的继承机制有效解决了代码复用的问题。人们可以像使用集成电路(IC)构造计算机硬件那样,比较方便地重用对象类来构造软件系统。 二、编程题

【程序参考代码】

/*学生信息管理系统C语言源代码student.c*/ #include /*包含输入/输出头文件*/ #include /*包含字符串处理头文件*/ #include

#define MAXSIZE 100 /*能够处理的学生总人数,可以随意修改*/ typedef struct { /*用于存放生日信息的结构体*/ int year; int month; int day; }Date;

typedef struct Stud{ /*用于存放学生信息的结构体*/ char Num[12]; /*学号为11位*/

char Name[11]; /*姓名,最多5个汉字*/

char Sex[2]; /*性别,男记为m,女记为f */

2

Date Birthday; /*出生日期*/ float English, DataStructure, CPlusPlus; /*三门课成绩*/

float Sum, Average; /*总成绩、平均成绩*/ }Student;

char CurFile[40]; /*存放当前正在操作的磁盘文件的文件名*/ int IsOpen=0; /*当前是否有磁盘文件被打开标志*/ int found=0; /*在查找学生信息时是否找到标志*/

Student stud[MAXSIZE]; /*用于存放读入内存中的所有学生信息的全局数组*/ int Index=0; /*存放实际学生人数的全局变量*/

/*各自定义函数原型声明*/

void Create(); /*新建学生信息文件*/

void Open(); /*打开学生信息文件,并读取学生信息到全局数组stud中*/ void Display(); /*显示学生信息*/ void Search(); /*查询学生信息*/

int SearchNum(char* Num); /*按学号查询学生信息*/ int SearchName(char* Name); /*按姓名查询学生信息*/ void Append(); /*添加学生信息*/ void Modify(); /*修改学生信息*/ void Delete(); /*删除学生信息*/

void Total(); /*统计所有学生某一科目总成绩*/ void Sort(); /*学生信息排序*/ void Backup(); /*备份学生信息*/ void menu() /*系统功能菜单*/ { int choice; /*用于保存用户对功能菜单的选择结果*/ for( ; ; ) { /*显示系统功能菜单*/ printf(\ printf(\学生信息管理系统 *******************\\n\ printf(\ printf(\ 1.新建学生信息文件 *****************\\n\ printf(\ 2.打开学生信息文件 *****************\\n\ printf(\ 3.显示学生信息 *****************\\n\ printf(\ 4.查询学生信息 *****************\\n\ printf(\ 5.添加学生信息 *****************\\n\ printf(\ 6.修改学生信息 *****************\\n\ printf(\ 7.删除学生信息 *****************\\n\ printf(\ 8.统计学生信息 *****************\\n\ printf(\ 9.学生信息排序 *****************\\n\ printf(\ 10.备份学生信息 *****************\\n\ printf(\ 0.退出系统 *****************\\n\ printf(\ printf(\ 请选择要执行的操作(0~8):_\ scanf(\ switch(choice){

case 1: Create(); break; case 2: Open(); break; case 3: Display(); break; case 4: Search(); break; case 5: Append(); break; case 6: Modify(); break; case 7: Delete(); break; case 8: Total(); break; case 9: Sort(); break; case 10: Backup(); break; case 0: return;

第 3 页

default: printf(\选择错误!请重新选择。\\n\ }/*switch结束*/ }/*for结束*/ }

void ReOrEx()/*在用户执行完一项系统功能后,可以选择:是继续运行系统,还是退出系统*/ { int n;

printf(\ printf(\ 1. 返回上级菜单 **************\\n\ printf(\ 0. 退出系统 **************\\n\ printf(\ printf(\ 请选择(1/0)?_\ scanf(\ if(n==0) { printf(\ printf(\ 谢谢使用本系统! ***************\\n\ printf(\ exit(1); } }

void main()

{ printf(\ printf(\ 欢迎使用学生信息管理系统! *********\\n\ printf(\ system(\ menu();/*系统功能以菜单的形式提供给用户*/

printf(\ printf(\ 谢谢使用本系统! ***************\\n\ printf(\}/*main函数结束*/

/*各自定义函数实现代码*/

int New(char* FileName) /*创建磁盘文件*/ { FILE *fp;

if((fp=fopen(FileName,\ { return 0; } else { fclose(fp); Index=0; return 1; } }

void Create() /*新建学生信息文件*/ { char FileName[40]; printf(\请输入新建文件的名称:\ scanf(\ if(strcmp(FileName, \ { strcat(FileName, \ if(!New(FileName)) printf(\文件创建失败!\\n\ else { strcpy(CurFile, FileName);

printf(\文件创建成功!\\n\ } } else { printf(\是备份文件,禁止创建与此文件同名的文件!\\n\ } ReOrEx(); }

void Open() /*打开学生信息文件*/ { char FileName[40]; printf(\请输入要打开的数据文件的名称:\ scanf(\ if(strcmp(FileName, \ { strcat(FileName, \

4

if(IsOpen==0) { FILE *fp;

if((fp=fopen(FileName, \ { printf(\文件打开失败!\\n\ } else { IsOpen=1; Index=0;

while(!feof(fp)) { fread(&stud[Index], sizeof(struct Stud), 1, fp); Index++; } Index--; printf(\学生总人数为:%d\\n\ fclose(fp); printf(\文件打开成功!\\n\ strcpy(CurFile, FileName); } } else printf(\文件已经打开!\\n\ } else printf(\是备份文件,禁止打开此文件!\\n\ ReOrEx(); }

void Display() /*显示全部学生信息*/ { int i;

if(!strcmp(CurFile, \ { printf(\当前并未打开或新建文件,无法显示!\\n\ } else { printf(\ 显示所有学生成绩信息\\n\\n\

printf(\\\\\\ for(i=0; i

int SearchNum(char* Num) /*按学号查询学生信息*/ { int i; for(i=0;

int SearchName(char* Name) /*按姓名查询学生信息*/ { int i; for(i=0; i

第 5 页

return i; } } printf(\没有此学生的信息!\\n\ found=0; return 0; }

void Search() /*查询学生信息*/ { int n; int i; char Num[12]; char Name[10]; if(!strcmp(CurFile, \ { printf(\当前并未打开或新建文件,无法查询!\\n\ } else { printf(\ 查询某一学生信息\\n\ printf(\ printf(\ 1. 按学号查询 *************\\n\ printf(\ 2. 按姓名查询 *************\\n\ printf(\ printf(\ 请选择(1/2)?_\ scanf(\ if(n==1) { printf(\请输入学生学号:\\n\ scanf(\ i=SearchNum(Num); } else if(n==2) { printf(\请输入学生姓名:\\n\ scanf(\ i=SearchName(Name); } printf(\该学生的具体信息为:\\n\\n\

printf(\

\

printf(\

stud[i].Sex, stud[i].Birthday.year, stud[i].Birthday.month, stud[i].Birthday.day, stud[i].English, stud[i].DataStructure, stud[i].CPlusPlus, stud[i].Sum, stud[i].Average); } ReOrEx(); }

void AddData() /*添加一条学生信息*/ { char Num[12]; char Name[10]; char Sex[2]; int Year, Month, Day; float English, DataStructure, CPP; int location; if(Index>=MAXSIZE) { printf(\错误! 学生信息已满,不能添加!\\n\} else { printf(\执行添加学生信息操作!\\n\ printf(\请输入学生学号:\ scanf(\ location=SearchNum(Num); if (!found) { printf(\可以进行添加操作!\\n\ printf(\请输入学生姓名:\ scanf(\ printf(\请输入学生性别:\

6

scanf(\ printf(\请输入学生出生年份:\ scanf(\ printf(\请输入学生出生月份:\ scanf(\ printf(\请输入学生出生日:\ scanf(\ printf(\请输入学生英语成绩:\ scanf(\ printf(\请输入学生数据结构成绩:\ scanf(\ printf(\请输入学生C++成绩:\ scanf(\ printf(\ strcpy(stud[Index].Num, Num); strcpy(stud[Index].Name, Name); strcpy(stud[Index].Sex, Sex); stud[Index].Birthday.year=Year; stud[Index].Birthday.month=Month; stud[Index].Birthday.day=Day; stud[Index].English=English; stud[Index].DataStructure=DataStructure; stud[Index].CPlusPlus=CPP; stud[Index].Sum=English+DataStructure+CPP; stud[Index].Average=stud[Index].Sum/3; Index++; printf(\插入一条学生信息操作成功!\\n\ } else printf(\不能进行添加学生信息操作!\\n\ } }

void Save(char* FileName) /*学生信息存盘*/ { FILE *fp; int i; if((fp=fopen(FileName, \ { printf(\文件打开失败!\return; } for(i=0;I

void Append() /*添加学生信息*/ { if(!strcmp(CurFile, \ { printf(\当前并未打开或新建文件,无法添加!\\n\} else { AddData(); Save(CurFile); } ReOrEx(); }

void ModifyData() /*修改一条学生信息*/ { char Num[12]; char Name[10]; char Sex[2]; float English, DataStructure, CPP; int Year, Month, Day; int location; printf(\执行修改学生信息操作!\\n\\n\ printf(\请输入将要修改的学生的学号:\ scanf(\ location=SearchNum(Num); if (found) { printf(\可以进行修改学生信息操作!\\n\

第 7 页

printf(\请输入学生姓名:\ scanf(\ printf(\请输入学生性别:\ scanf(\ printf(\请输入学生出生年份:\ scanf(\ printf(\请输入学生出生月份:\ scanf(\ printf(\请输入学生出生日:\ scanf(\ printf(\请输入学生英语成绩:\ scanf(\ printf(\请输入学生数据结构成绩:\ scanf(\ printf(\请输入学生C++成绩:\ scanf(\ printf(\ strcpy(stud[location].Num, Num); strcpy(stud[location].Name, Name); strcpy(stud[location].Sex, Sex); stud[location].Birthday.year=Year; stud[location].Birthday.month=Month; stud[location].Birthday.day=Day; stud[location].English=English; stud[location].DataStructure=DataStructure; stud[location].CPlusPlus=CPP; stud[location].Sum=English+DataStructure+CPP; stud[location].Average=stud[Index].Sum/3; printf(\执行修改学生信息操作成功!\\n\ } else printf(\不能进行修改学生信息操作!\\n\}

void Modify() /*修改学生信息*/ { if(!strcmp(CurFile, \ { printf(\当前并未打开或新建文件,无法修改!\\n\ } else { ModifyData(); Save(CurFile); } ReOrEx(); }

int DeleteData()/*删除一条学生信息*/ { char Num[12]; int location,i; printf(\ 执行删除学生信息操作!\\n\\n\ printf(\警告!学生信息一旦删除,将不可恢复。请小心使用该操作!\\n\\n\ printf(\请输入将要删除的学生的学号:\\n\ scanf(\ location=SearchNum(Num); if(found) { if(location!=MAXSIZE) { for(i=location; i

8

第4章 继承与派生

一、简答题

1.【解】各成员在各类的范围内的访问权限如下表:

类的范围 基类A f1 i f2 j k 私有 f3 公用 公用 m 保护 n 私有 f4 p 保护 公用 公用 保护 保护 公用派生类B 公用 公用 保护 保护 不可访问 公用派生类C 公用 公用 保护 保护 不可访问 保护 不可访问 公用 (1)在main 函数中能用b.i访问派生类B对象b中基类A的成员i,因为它在派生类B中是公用数据成员。 不能用b.j访问派生类B对象b中基类A的成员j,因为它在派生类B中是保护数据成员,不能被类外访问。 不能用b.k访问派生类B对象b中基类A的成员k,因为它是基类A的私用数据成员,只有基类A的成员函数可以访问,不能被类外访问。

(2)派生类B中的成员函数能调用基类A中的成员函数f1和f2,因为f1、f2在派生类B中是公用成员和保护成员,可以被派生类的成员函数访问。

(3)派生类B中的成员函数能访问基类A中的数据成员i、j,因为i,j在派生类B中是公用成员和保护成员,可以被派生类的成员函数访问。

派生类B中的成员函数不能访问基类A中的数据成员k,它在派生类B中是不可访问的成员。

(4)能在main 函数中用c.i访问基类A的成员i,不能用c.j,c.k访问基类A的成员j,k,因为它们在派生类C中是保护成员和私有成员,不能被类外访问。也不能用c.m,c.n访问派生类B的成员m,n,因为它们在派生类C中也是保护成员和私有成员,不能被类外访问。也不能用c.p访问派生类C中的私用成员p。

(5)能在main函数中用c.f1(),c.f3()和c.f4()调用f1,f3,f4成员函数,因为它们在派生类C中是公用成员函数,可以在类外被访问。

不能在main函数中用c.f2()调用f2成员函数,因为它在派生类C中是保护成员函数,不能在类外被访问。 (6)派生类C的成员函数f4能调用基类A中的成员函数f1,f2和派生类中的成员函数f3,因为f1、f3在派生类C中是公用成员函数,f2在派生类C中是保护成员函数,都可以被派生类C的成员函数调用。 2.

解:按题意没有操作,所以只列出数据成员,也不再检验 #include using namespace std; class Commodity{

double price; //价格 char name[20];//商品名

char manufacturer[20];//生产厂家 int items;//数量 };

class Clothing:public Commodity{//服装类

char texture[20];//材料质地 };

class Electric_Appliance:public Commodity{//家电类

enum {Black,White}type;//黑白家电 };

class Vehicle:public Commodity{//车辆类

int wheel_num;//车轮数量 };

class Shirt:public Clothing{//衬衣类

enum {Formal,Casual}Style;//式样:正式、休闲 };

class Garment:public Clothing{//外衣类

enum {Jacket,Coat}Style;//式样:夹克、外套 };

24

class Hat:public Clothing{//帽子类

enum {Winter,Summer,Spring_Autumn}Style;//季节风格 };

class Shoes:public Clothing{//鞋子类

enum {Winter,Summer,Spring_Autumn}Style;//季节风格 };

class Air_Cindition:public Electric_Appliance{//空调

bool warm_cool; //是否冷暖 float power; //功率 };

class Television:public Electric_Appliance{//电视类

int Size; //尺寸 bool isColor; //是否彩色 };

class Acoustics:public Electric_Appliance{//音响类

int speaker_num; //喇叭数目 float power; //功率 };

class Bicycle:public Vehicle{//自行车类

int speed_grades; //调速级数 int wheel_size; //轮子大小 };

class Car:public Vehicle{//轿车类

float volume; //排气量 bool isSkylight; //是否有天窗 int box_num; //厢数 };

class Motorcycle:public Vehicle{//摩托车类

float volume; //排气量 };

int main(){ return0; }

二、编程题

1.【程序参考代码】 #include using namespace std; #include class Country {public:

Country(char *n,char *c,double p){ strcpy(name,n); strcpy(capital,c); population=p; void print(){ cout<

char name[10],capital[50]; double population; };

class Province:private Country {public:

Province(char *n,char *c,double p,char *cc,double pp):Country(n,c,p) { strcpy(province_capital,cc); province_population=pp; } void display() { print();

cout<

char province_capital[50]; double province_population; };

int main()

第 25 页

} {

Province p(\ p.display(); return 0; } 2.【程序参考代码】 #include #include using namespace std;

class Person //声明公共基类Person {public:

void set() { cin >>name>>sex>>age; } //姓名、性别、年龄的输入

void display() { cout<<\ } //姓名、性别、年龄的显示 private:

string name; //姓名 char sex; //性别 int age; //年龄 };

class Teacher: public Person //声明Teacher类为Person类的公用派生类 {public:

void set()

{ Person::set(); //姓名、性别、年龄的输入 cin>> teachId >> title >> wage; //工号、职称、工资的输入 }

void display()

{ Person::display(); //姓名、性别、年龄的显示 cout<<\ //工号、职称、工资的显示 } private:

string teachId; //工号 string title; //职称 float wage; //工资 };

class Student: public Person //声明Student类为Person类的公用派生类 {public:

void input() { Person::set(); //姓名、性别、年龄的输入 cin>>stuId>>stuClass>>profession>>score; //学号、班级、专业、入学成绩的输入 }

void display() { Person::display(); //姓名、性别、年龄的显示 cout<<\

<< profession <<\学号、班级、专业、入学成绩的显示

}

private:

string stuId; //学号 string stuClass; //班级 string profession; //专业

float score; //入学成绩 };

int main( )

{ Teacher teacher; Student student;

cout<<\ teacher.set();

26

cout<<\ teacher.display();

cout<<\ student.input();

cout<<\ student.display(); return 0; } 3.【程序参考代码】 #include using namespace std; class Building{ public:

Building(int f,int r,double a) { floors=f; rooms=r; area=a; } protected:

int floors; int rooms; double area; };

class TeachBuilding:public Building{ public:

TeachBuilding (int f,int r,double a,int cr):Building(f,r,a){ classrooms=cr; } void show() {

cout<<\

<<\

} private:

int classrooms; };

class DormBuilding:public Building{ public:

DormBuilding (int f,int r,double a,int d,int sc) :Building(f,r,a){ dormitories =d; studcount =sc; } void show() {

cout<<\

<<\

} private:

int dormitories; int studcount; };

int main() {

TeachBuilding TB(6, 80,200,35); TB.show();

DormBuilding DB(6, 80,200,35,300); DB.show(); return 0; } 4.【程序参考代码】 #include #include using namespace std; class Car {protected:

string _model; int _color;

unsigned int _motopower;

第 27 页

unsigned int _speed; unsigned int _weight; unsigned int _id; public: void show(); };

class Bus: public Car {private:

unsigned int _seatnum; string _corp; public: void show(); Bus( string model, int color, unsigned int motopower, unsigned int speed,unsigned int weight, unsigned int id, unsigned int seatnum, string corp ) { _model = model; _color = color; _motopower = motopower; _speed = speed; _weight = weight; _id = id; _seatnum = seatnum; _corp = corp; } };

class Truck : public Car {private:

unsigned int _load; string _corp; public: void show(); Truck( string model, int color, unsigned int motopower, unsigned int speed, unsigned int weight, unsigned int id, unsigned int load, string corp ) { _model = model; _color = color; _motopower = motopower; _speed = speed; _weight = weight; _id = id; _load = load; _corp = corp; } };

void Car::show() { cout<<\型号:\

cout<<\颜色:\

cout<<\发动机功率:\ cout<<\车速:\ cout<<\重量:\ cout<<\车牌号码:\}

void Bus::show() { cout<<\型号:\ cout<<\颜色:\ cout<<\发动机功率:\ cout<<\车速:\ cout<<\重量:\ cout<<\车牌号码:\

cout<<\客车座位数:\ cout<<\客运公司:\}

void Truck::show(){ cout<<\型号:\ cout<<\颜色:\ cout<<\发动机功率:\ cout<<\车速:\ cout<<\重量:\ cout<<\车牌号码:\ cout<<\载货重量:\ cout<<\货运公司:\

28

}

int main( int argc, char** argv ) { Car *a = new Bus(\黄海\北京客运\ Car *b = new Truck(\东风\北京货运\ cout<<\ a->show(); cout<<\ b->show(); system(\ return 0; } 5.【程序参考代码】 #include using namespace std; #include class Circle {public: Circle(double r){radius=r;} double get_area() {return 3.1416*radius*radius;} private: double radius; };

class Table{ public: Table(double h){height=h;} double get_height(){return height;} private: double height; };

class RoundTable:public Table,public Circle { char *color; public: RoundTable(double h,double r,char c[]):Table(h),Circle(r) { color=new char[strlen(c) +1]; strcpy(color,c); } char* get_color(){return color;} };

int main() { RoundTable rt(0.8,1.0,\白色\ cout<<\圆桌的高:\ cout<<\圆桌面积:\ cout<<\圆桌颜色:\ return 0; } 6.【程序参考代码】 #include #include using namespace std; class Car {public:

Car( string model, int color, unsigned int motopower, unsigned int speed,unsigned int weight, unsigned int id) { _model = model; _color = color; _motopower = motopower;

第 29 页

_speed = speed; _weight = weight; _id = id; } void show(); private:

string _model; int _color;

unsigned int _motopower; unsigned int _speed; unsigned int _weight; unsigned int _id; };

class Bus: virtual public Car {public: Bus( string model, int color, unsigned int motopower, unsigned int speed,unsigned int weight, unsigned int id, unsigned int seatnum, string corp ):Car(model,color, motopower,speed,weight,id) { _seatnum = seatnum; _corp = corp; } void display(); protected:

unsigned int _seatnum; string _corp; };

class Wagon : virtual public Car {public: Wagon( string model, int color, unsigned int motopower, unsigned int speed,unsigned int weight, unsigned int id, unsigned int load, string corp ): Car(model,color, motopower,speed,weight,id) { _load = load; _corp = corp; } void display(); protected:

unsigned int _load; string _corp; };

class StationWagon : public Bus,public Wagon {public: StationWagon( string model, int color, unsigned int motopower, unsigned int speed,unsigned int weight, unsigned int id, unsigned int seatnum,unsigned int load, string corp ):

Car(model,color, motopower,speed,weight,id),

Bus(model,color, motopower,speed,weight,id,seatnum,corp), Wagon(model,color, motopower,speed,weight,id,load,corp)

{ } void display(); };

void Car::show() { cout<<\型号:\ cout<<\颜色:\ cout<<\发动机功率:\ cout<<\车速:\ cout<<\重量:\ cout<<\车牌号码:\ }

void Bus::display() { show();

cout<<\客车座位数:\ cout<<\客运公司:\}

void Wagon::display(){ show();

30

cout<<\载货重量:\ cout<<\货运公司:\}

void StationWagon::display(){ show(); cout<<\客车座位数:\ cout<<\载货重量:\ cout<<\客运及货运公司:\}

int main( ) { StationWagon sw(\黄海\北京客货运\ sw.display(); system(\ return 0; } 7.【程序参考代码】 #include #include using namespace std; class Date{ public: Date(){ year=0; month=0; day=0; } //无参构造函数 Date(int mm, int dd, int yy){ year=yy; month=mm; day=dd; } //带参数的构造函数 Date(const Date &d){ year=d.year; month=d.month; day=d.day; } //复制构造函数 void setDate(const int, const int, const int); //修改日期的函数 void display(); //输出日期的函数 int getYear(); //获取年份的函数 int getMonth(); //获取月份的函数 int getDay(); //获取日信息的函数 private: int year, month, day; };

//设置成员变量,mm:月份;dd:天数;yy:年份; void Date::setDate(const int mm, const int dd, const int yy) { year=yy; month=mm; day=dd; }

void Date::display() {

cout<

int Date::getYear(){ return year; } int Date::getMonth(){ return month; } int Date::getDay(){ return day; } class Employee {public:

Employee(char *ID, char *newName,int y,int m,int d); Employee(const Employee &);

void SetData(char *ID, char *newName, int y,int m,int d); void Display(); bool IsBirthday(Date day); private: char id[10]; char name[20]; Date birthday; };

第 31 页

Employee::Employee(char *ID, char *newName, int y,int m,int d):birthday(y,m,d) { strcpy(id, ID); strcpy(name, newName); }

Employee::Employee(const Employee &other) { strcpy(id, other.id); strcpy(name, other.name); birthday=other.birthday; }

void Employee::SetData(char *ID, char *newName,int y,int m,int d) { strcpy(id, ID); strcpy(name, newName); birthday.setDate(y,m,d); }

void Employee::Display() { cout<<\ cout<<\ birthday.display(); cout<

bool Employee::IsBirthday(Date day) { if(birthday.getYear()==day.getYear() && birthday.getMonth()==day.getMonth()

&& birthday.getDay()==day.getDay())

return true; else return false; }

int main() { Date today(1980,11,20); Employee employee(\ if( employee.IsBirthday(today)) cout<<\ else cout<<\ system(\ return 0; }

32

第5章 多态性与虚函数

一、简答题

1.【答案要点】

在面向对象方法中一般是这样表述多态性:向不同的对象发送同一个消息,不同的对象在接收时会有不同的反应,产生不同的动作。也就是说,每个对象可以用自己的方式去响应共同的消息。在C++程序设计中,多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数。

多态从实现的角度来讲可以划分为两类:编译时的多态和运行时的多态。编译时的多态是在编译的过程中确定了同名操作的具体操作对象,而运行时的多态则是在程序运行过程中才动态地确定操作所针对的具体对象。在C++中,编译时的多态性主要是通过函数重载和运算符重载实现的。运行时的多态性主要是通过虚函数来实现的。 2.【答案要点】

如果一个类至少有一个纯虚函数,那么就称该类为抽象类。

抽象类只能作为其他类的基类来使用,为其派生类提供一个接口规范,其纯虚函数的实现由派生类给出。 3.【答案要点】

构造函数不能声明为虚构造函数。因为虚函数作为运行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有意义的。

析构函数可以是虚函数,并且最好把基类的析构函数声明为虚函数,这将使其所有派生类的析构函数自动成为虚函数。这样,如果程序中显式地用了delete运算符准备删除一个对象,而delete运算符的操作对象用了指向派生类对象的基类指针,则系统会调用相应类的析构函数,对该派生类对象进行清理工作。 4.【答案要点】

C++中的多态性可以分为4类:参数多态、包含多态、重载多态和强制多态。参数多态如函数模板和类模板,包含多态通过虚函数来实现,重载多态如函数重载和运算符重载,强制多态如类型强制转换。前面两种统称为通用多态,而后面两种统称为专用多态。

二、编程题

1.【程序参考代码】 #include #include using namespace std; class base {public: void settitle() {

cout<<\书名:\ cin>>title; }

void printtitle(){ cout<<\书名:\ \ } virtual bool isgood()=0; protected: char title[80]; };

class Book: public base {public: void setsold() {

cout<<\每月销售书量:\

cin>>numsold; } bool isgood(){ return(numsold>500)?true:false; } private: int numsold; //月销售书量 };

class Journal: public base

第 33 页

本文来源:https://www.bwwdw.com/article/idig.html

Top