C面向对象程序设计教程课后习题答案

上传人:ni****g 文档编号:568612239 上传时间:2024-07-25 格式:PPT 页数:177 大小:653.50KB
返回 下载 相关 举报
C面向对象程序设计教程课后习题答案_第1页
第1页 / 共177页
C面向对象程序设计教程课后习题答案_第2页
第2页 / 共177页
C面向对象程序设计教程课后习题答案_第3页
第3页 / 共177页
C面向对象程序设计教程课后习题答案_第4页
第4页 / 共177页
C面向对象程序设计教程课后习题答案_第5页
第5页 / 共177页
点击查看更多>>
资源描述

《C面向对象程序设计教程课后习题答案》由会员分享,可在线阅读,更多相关《C面向对象程序设计教程课后习题答案(177页珍藏版)》请在金锄头文库上搜索。

1、C+C+面向对象程序设计教程面向对象程序设计教程第第1 1章章 C+C+程序设计基础程序设计基础习题解答习题解答 1实用精品课件PPT一、选择题一、选择题1下列语句中,错误的是下列语句中,错误的是 。A)const int buffer = 256;B)const int temp;C)const double *point;D)double * const pt = new double(5.5);解析:解析:修饰符修饰符const声明的常量只能被读取,该常量必须在声声明的常量只能被读取,该常量必须在声明时进行初始化,并且它的值在程序中不能改变。选项明时进行初始化,并且它的值在程序中不能改变

2、。选项B)没)没有初始化,错误。选项有初始化,错误。选项C)定义了一个指向)定义了一个指向const double的指的指针,其意义为指针针,其意义为指针 point指向的变量不能通过指针指向的变量不能通过指针point来改来改变,变,D)中表示指针)中表示指针pt是常量指针,已在声明时进行了初始化。是常量指针,已在声明时进行了初始化。答案:答案:B2实用精品课件PPT2关于函数重载,下列叙述中错误的是关于函数重载,下列叙述中错误的是 。A)重载函数的函数名必须相同)重载函数的函数名必须相同B)重载函数必须在参数个数或类型上有所不同)重载函数必须在参数个数或类型上有所不同C)重载函数的返回值类

3、型必须相同)重载函数的返回值类型必须相同D)重载函数的函数体可以有所不同)重载函数的函数体可以有所不同解析:解析:函数重载是用同一个函数名字在不同的参数类型或参函数重载是用同一个函数名字在不同的参数类型或参数个数上做类似的操作方作,它们的实现方法可以不同。所数个数上做类似的操作方作,它们的实现方法可以不同。所以说,重载函数的函数名必须相同,函数体可以有所不同。以说,重载函数的函数名必须相同,函数体可以有所不同。函数重载必须在参数类型或参数个数上不一样,不能依靠返函数重载必须在参数类型或参数个数上不一样,不能依靠返回值不一样来区分重载函数。回值不一样来区分重载函数。答案:答案:C3实用精品课件P

4、PT3有以下程序:有以下程序:void Fun(int i, int j)cout i + j endl;/ 输出输出i+jvoid Fun(int i)cout i+ endl;/ 输出输出i+int main()/ 主函数主函数main()int a = 1;/ 定义变量定义变量iFun(a);/ 调用调用Fun()return 0; / 返回值返回值0, 返回操作系统返回操作系统该程序执行后输出的结果是该程序执行后输出的结果是 。A)1 B)2 C)3 D)4解析:解析:由于主函数中调用的由于主函数中调用的Fun()函数只有一个参数,故执行的是函数只有一个参数,故执行的是void Fun

5、( int i )的版本,执行的版本,执行“cout i+ endl;”时,由于是后缀时,由于是后缀“+”,所,所以先输出以先输出i的值的值1,再使,再使i加加1。答案:答案:A4实用精品课件PPT二、编程题二、编程题 1编写一个编写一个C+程序,要求输出程序,要求输出“欢迎学习欢迎学习C+语言语言!”。参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std int main()/ 主函数主函数main() cout 欢迎学习欢迎学习C+语言语言! endl;/ 用用C+的方法输出一行的方法输出一行syst

6、em(PAUSE);/ 调用库函数调用库函数system( ),输出提示信息,输出提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统 5实用精品课件PPT*2编一个程序,用一个函数实现求编一个程序,用一个函数实现求n个整型数据的最小值。函数原型如下:个整型数据的最小值。函数原型如下:int Min(int a, int n)参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std int Min(int a, int n)/ 求求n个整型数据的最小值个整型数据的最小值int m = a0

7、, i;/ 临时变量临时变量for (i = 1; i n; i+)/ 依次比较求最小值依次比较求最小值if (ai m) / 如果如果ai更小更小m = ai;/ ai为当前最小值为当前最小值 return m;/ 返回最小值返回最小值int main()/ 主函数主函数main()int a = 1, 2, 3, 4, 5, 6, 7, 8, 9, -10, n = 10; cout 最小值为最小值为 Min(a, n) endl;/ 输出最小值输出最小值system(PAUSE);/ 调用库函数调用库函数system( ),输出提示信息,输出提示信息return 0; / 返回值返回值,

8、 返回操作系统返回操作系统6实用精品课件PPT3求求2个数或个数或3个整数中的最大数,用两个同名函数实现,要求编写测试程序。个整数中的最大数,用两个同名函数实现,要求编写测试程序。 参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std int Max(int x, int y)/ 求求x,y的最大值的最大值return x y ? x : y;/ 返回返回x,y的最大值的最大值int Max(int x, int y, int z)/ 求求x,y,z的最大值的最大值int m = x y ? x : y;

9、/ x,y的最大值的最大值m = m z ? m : z;/ m,z的最大值的最大值return m;/ 返回返回x,y,z的最大值的最大值int main()/ 主函数主函数main()cout 2,3的最大值为的最大值为 Max(2, 3) endl; cout 1,6,8的最大值为的最大值为 Max(1, 6, 8) endl;system(PAUSE);/ 调用库函数调用库函数system( ),输出提示信息,输出提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统7实用精品课件PPT4用变量的引用作函数形参,实现交换两个整型变量,要求编写测试程序。用变量的引用作函

10、数形参,实现交换两个整型变量,要求编写测试程序。 参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std void Swap(int &x, int &y)/ 交换交换x,y的值的值int t = x; x = y; y = t;/ 循环赋值交换循环赋值交换x,y的值的值int main()/ 主函数主函数main()int x = 1, y = 6;cout 交换前交换前: x , y endl;Swap(x, y);cout 交换后交换后: x , y endl;system(PAUSE);/ 调用库函

11、数调用库函数system( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统8实用精品课件PPT*5编一个程序,用同一个函数名对编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可个数据进行从小到大排序,数据类型可以是整型、单精度实型、双精度实型,用重载函数实现。以是整型、单精度实型、双精度实型,用重载函数实现。参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std void Sort(int a, int n)/ 对对a0.an-1进行排序

12、进行排序int tem, i, j;/ 定义变量定义变量for (i = 0; i n- 1; i+)for (j = i + 1; j aj)/ ai比比aj更大更大tem = ai; ai = aj; aj = tem; 9实用精品课件PPT*5编一个程序,用同一个函数名对编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可个数据进行从小到大排序,数据类型可以是整型、单精度实型、双精度实型,用重载函数实现。以是整型、单精度实型、双精度实型,用重载函数实现。参考程序参考程序:void Sort(float a, int n)/ 对对a0.an-1进行排序进行排序float tem

13、;/ 临时变量临时变量int i, j;/ 定义变量定义变量for (i = 0; i n- 1; i+)for (j = i + 1; j aj)/ ai比比aj更大更大tem = ai; ai = aj; aj = tem;10实用精品课件PPT*5编一个程序,用同一个函数名对编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可个数据进行从小到大排序,数据类型可以是整型、单精度实型、双精度实型,用重载函数实现。以是整型、单精度实型、双精度实型,用重载函数实现。参考程序参考程序:void Sort(double a, int n)/ 对对a0.an-1进行排序进行排序double

14、 tem;/ 临时变量临时变量int i, j;/ 定义变量定义变量for (i = 0; i n- 1; i+)for (j = i + 1; j aj)/ ai比比aj更大更大tem = ai; ai = aj; aj = tem;11实用精品课件PPT*5编一个程序,用同一个函数名对编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可个数据进行从小到大排序,数据类型可以是整型、单精度实型、双精度实型,用重载函数实现。以是整型、单精度实型、双精度实型,用重载函数实现。参考程序参考程序:int main()/ 主函数主函数main()int a = 1, 3, 2, 5, 6,

15、9, 0, 6;/ 定义定义afloat b = 1.6, 3.3, 2.8, 5.6, 6.8, 9.6, 0.6, 6.8; / 定义定义bdouble c = 1.2, 3.1, 2.6, 5.8, 6.8, 9.8, 0.8, 6.2;/ 定义定义cint i, n = 8;/ 定义变量定义变量Sort(a, n);/ 对对a排序排序cout a:;/ 输出提示输出提示for (i = 0; i n; i+)cout ai ;/ 输出输出aicout endl;/ 换行换行12实用精品课件PPT*5编一个程序,用同一个函数名对编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类

16、型可个数据进行从小到大排序,数据类型可以是整型、单精度实型、双精度实型,用重载函数实现。以是整型、单精度实型、双精度实型,用重载函数实现。参考程序参考程序:Sort(b, n);/ 对对b排序排序cout b:;/ 输出提示输出提示for (i = 0; i n; i+)cout bi ;/ 输出输出bicout endl;/ 换行换行Sort(c, n);/ 对对c排序排序cout c:;/ 输出提示输出提示for (i = 0; i n; i+)cout ci ;/ 输出输出cicout endl;/ 换行换行system(PAUSE);/ 调用库函数调用库函数system( ),输出系统

17、提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统13实用精品课件PPTC+C+面向对象程序设计教程面向对象程序设计教程第第2 2章章 类和对象类和对象习题解答习题解答 14实用精品课件PPT一、选择题一、选择题1下列选项中,不属于面向对象程序设计特征的是下列选项中,不属于面向对象程序设计特征的是 。A)继承性)继承性B)多态性)多态性C)类比性)类比性D)封装性)封装性解析:解析:封装性、继承性和多态性是面向对象思想的封装性、继承性和多态性是面向对象思想的3个主要特征。个主要特征。封装性指将数据和算法捆绑成一个整体,这个整体就是对象,描封装性指将数据和

18、算法捆绑成一个整体,这个整体就是对象,描述对象的数据被封装在其内部。继承性是指一种事物保留了另一述对象的数据被封装在其内部。继承性是指一种事物保留了另一种事物的全部特征,并且具有自身的独有特征。多态性主要指当种事物的全部特征,并且具有自身的独有特征。多态性主要指当多个事物继承自一种事物时,同一操作在它们之间表现出不同的多个事物继承自一种事物时,同一操作在它们之间表现出不同的行为。行为。答案:答案:C15实用精品课件PPT2在面向对象方法中,实现信息隐蔽是依靠在面向对象方法中,实现信息隐蔽是依靠 。A)对象的继承)对象的继承B)对象的多态)对象的多态C)对象的封装)对象的封装D)对象的分类)对象

19、的分类解析:解析:在面向对象方法中,封装性是指将数据和算法捆绑成一个在面向对象方法中,封装性是指将数据和算法捆绑成一个整体,这个整体就是对象,描述对象的数据被封装在内部,只可整体,这个整体就是对象,描述对象的数据被封装在内部,只可以通过对象提供的算法来进行操作,从而实现信息隐蔽。以通过对象提供的算法来进行操作,从而实现信息隐蔽。答案:答案:C16实用精品课件PPT3下列关于类和对象的叙述中,错误的是下列关于类和对象的叙述中,错误的是 。A)一个类只能有一个对象)一个类只能有一个对象B)对象是类的具体实例)对象是类的具体实例C)类是某一类对象的抽象)类是某一类对象的抽象D)类和对象的关系就像数据

20、类型和变量的关系)类和对象的关系就像数据类型和变量的关系解析:解析:在面向对象设计中,类是同一种对象的抽象,而不只是对在面向对象设计中,类是同一种对象的抽象,而不只是对一个对象的抽象,一个类具有多个对象。对象是类的具体实例。一个对象的抽象,一个类具有多个对象。对象是类的具体实例。就像数据类型和变量的关系,一种数据类型可以定义多个变量,就像数据类型和变量的关系,一种数据类型可以定义多个变量,一个变量却只能是一种数据类型。一个变量却只能是一种数据类型。答案:答案:A17实用精品课件PPT4有以下类声明:有以下类声明:class MyClass int num; ;则则MyClass类的成员类的成员

21、num是是 。A)公有数据成员)公有数据成员B)公有成员函数)公有成员函数C)私有数据成员)私有数据成员D)私有成员函数)私有成员函数解析:解析:函数声明时,函数名后必须带函数声明时,函数名后必须带“”,所以,所以num是数据是数据成员。在类中,当没有用访问权限标识符标识时,默认为私有权成员。在类中,当没有用访问权限标识符标识时,默认为私有权限。限。答案:答案:C18实用精品课件PPT5在下列函数原型中,可以作为类在下列函数原型中,可以作为类AA构造函数的是构造函数的是 。A)void AA(int);B)int AA();C)AA(int) const D)AA(int);解析:解析:构造函

22、数用于初始纶对象的数据成员,没有返回类型,而构造函数用于初始纶对象的数据成员,没有返回类型,而且由于常成员函数不能更新对象的数据成员,所以常成员函数也且由于常成员函数不能更新对象的数据成员,所以常成员函数也不可能作为构造函数。不可能作为构造函数。答案:答案:D19实用精品课件PPT6下列关于下列关于this指针的叙述中,正确的是指针的叙述中,正确的是 。A)任何与类相关的函数都有)任何与类相关的函数都有this指针指针B)类的成员函数都有)类的成员函数都有this指针指针C)类的友元函数都有)类的友元函数都有this指针指针D)类的非静态成员函数才有)类的非静态成员函数才有this指针指针解析

23、:解析:this指针只能在类的成员函数中使用,它指向该成员函数被指针只能在类的成员函数中使用,它指向该成员函数被调用的对象。但是有两种与类相关的函数都没有调用的对象。但是有两种与类相关的函数都没有this指针,即静态指针,即静态成员函数和友元函数。成员函数和友元函数。答案:答案:D20实用精品课件PPT7有以下程序:有以下程序:class Testprivate:static int n;/ 静态成员静态成员public:Test() n += 2; / 构造函数构造函数Test() n -= 3; / 析构函数析构函数static int GetNum() return n; / 返回返回n

24、; int Test:n = 1;/ 初始化初始化nint main()/ 主函数主函数main()Test *p = new Test;/ 定义指针定义指针pdelete p;/ 释放释放p指向的动太对象指向的动太对象cout n= Test:GetNum() endl;/ 输出输出nreturn 0; / 返回值返回值0, 返回操作系统返回操作系统执行后的输出结果是执行后的输出结果是 。A)n=0 B)n=1 C)n=2 D)n=3解析:解析:静态数据成员初始化的值为静态数据成员初始化的值为1,执行,执行“Test *p = new Test”将调用构将调用构造函数,执行造函数,执行“n

25、+= 2;”,n的值变为的值变为3,执行,执行“delete p;”时将调用析构函数,时将调用析构函数,执行执行“n -= 3;”,n的值减的值减3,变为,变为0。答案:答案:A21实用精品课件PPT8有以下程序:有以下程序:class MyClassprivate:int n;/ 数据成员数据成员public:MyClass(int k): n(k)/ 构造函数构造函数int Get() return n; / 返回返回nint Get() const return n + 1; / 返回返回n+1;int main()/ 主函数主函数main()MyClass a(5);/ 定义对象定义对

26、象aconst MyClass b(6);/ 定义对象定义对象bcout a.Get() b.Get() endl;/ 输出信息输出信息 return 0; / 返回值返回值0, 返回操作系统返回操作系统运行后的输出结果是运行后的输出结果是 。A)55 B)57 C)75 D)77解析:解析:const是一个判断重载的标志,是一个判断重载的标志,a.Get调用调用“int Get() return n; ”,故得到故得到5,而常对象,而常对象b执行执行 b.Get”时,调用常成员函数时,调用常成员函数“int Get() const return n + 1; ”,故得到,故得到6+1=7。答

27、案:答案:B22实用精品课件PPT9由于常对象不能被更新,因此由于常对象不能被更新,因此 。A)通过常对象只能调用它的常成员函数)通过常对象只能调用它的常成员函数B)通过常对象只能调用静态成员函数)通过常对象只能调用静态成员函数C)常对象的成员都是常成员)常对象的成员都是常成员D)通过常对象可以调用任何不改变对象值的成员函数)通过常对象可以调用任何不改变对象值的成员函数解析:解析:通过常对象只能调用类中的常成员函数,而不能调用类中的其他成员通过常对象只能调用类中的常成员函数,而不能调用类中的其他成员函数。函数。答案:答案:A23实用精品课件PPT10下列情况中,不会调用复制构造函数的是下列情况

28、中,不会调用复制构造函数的是 。A)用一个对象去初始化同一类的另一个新对象时)用一个对象去初始化同一类的另一个新对象时B)将类的一个对象赋予该类的另一个对象时)将类的一个对象赋予该类的另一个对象时C)函数的形参是类的对象,调用函数进行形参和实参结合时)函数的形参是类的对象,调用函数进行形参和实参结合时D)函数的返回值是类的对象的引用,函数执行返回调用时)函数的返回值是类的对象的引用,函数执行返回调用时解析:解析:只要在程序的执行中,需要用一个对象来初始化另一个对象,都要调只要在程序的执行中,需要用一个对象来初始化另一个对象,都要调用复制构造函数,包括用复制构造函数,包括A、B、C三种情况。三种

29、情况。答案:答案:D24实用精品课件PPT11以下关键字不能用来声明类的访问权限的是以下关键字不能用来声明类的访问权限的是 。A)public B)static C)protected D)private解析:解析:类的访问权限有三种:公有、私有、保护,关键字分别是类的访问权限有三种:公有、私有、保护,关键字分别是public,private,protected,。static用于静态成员的声明。用于静态成员的声明。答案:答案:B25实用精品课件PPT12有以下程序:有以下程序:class MyClasspublic:MyClass() cout A; / 无参构造函数无参构造函数MyClas

30、s(char c) cout c; / 带参构造函数带参构造函数MyClass() cout B; / 析构函数析构函数;int main()/ 主函数主函数main()MyClass a, *p;/ 定义变量定义变量p = new MyClass(X);/ 分配动态空间分配动态空间delete p;/ 释放动态空间释放动态空间cout endl;/ 换行换行 return 0; / 返回值返回值0, 返回操作系统返回操作系统执行这个程序,屏幕上将显示输出执行这个程序,屏幕上将显示输出 。A)ABX B)ABXB C)ABXB D)AXBB解析:解析:定义对象定义对象a时,调用一次构造函数时,

31、调用一次构造函数“MyClass() cout A; ”,但,但定义对象指针定义对象指针p时不调用构造函数;使用时不调用构造函数;使用new动态创建对象时,根据参数情况动态创建对象时,根据参数情况调用调用“MyClass(char c) cout c; ”,输出,输出X;执行;执行“delete p;”时,需要时,需要调用一次析构函数,输出调用一次析构函数,输出B;最后主函数结束时,对象最后主函数结束时,对象a调用一次析构函数,调用一次析构函数,输出输出B。答案:答案:D26实用精品课件PPT13有以下程序:有以下程序:class Testpublic:static int a;/ 静态成员静

32、态成员void Init() a = 1; / 初始化函数初始化函数Test(int a = 6) Init(); a+;/ 构造函数构造函数;int Test:a = 0;/ 初始化初始化aTest obj;/ 定义全局对象定义全局对象int main()/ 主函数主函数main()cout obj.a endl;/ 输出输出areturn 0; / 返回值返回值0, 返回操作系统返回操作系统运行时输出的结果是运行时输出的结果是 。A)0 B)1 C)2 D)3解析:解析:首先初始化静态数据成员首先初始化静态数据成员a为为0,然后在定义全局对象,然后在定义全局对象obj时调用构造函时调用构造

33、函数。这时有两个数。这时有两个a,一个是,一个是“Test(int a = 6) Init(); a+;”函数中的局部变量函数中的局部变量a,另一个是静态数据成员,另一个是静态数据成员a,需要靠作用域来区分。在执行,需要靠作用域来区分。在执行Init()时,由于离开时,由于离开了构造函数了构造函数“Test(int a = 6) Init(); a+;”的作用域,的作用域,Init()里的里的a为静态数据为静态数据成员,这时静态数据成员成员,这时静态数据成员a赋值为赋值为1;之后回到构造函数执行;之后回到构造函数执行a+,这个,这个a为为“Test(int a = 6) Init(); a+;

34、”中的中的a,值变为,值变为7,但当构造函数执行完毕后,但当构造函数执行完毕后,该局部变量该局部变量a随之消失,与对象无关。随之消失,与对象无关。obj.a调用的是静态数据成员,结果为调用的是静态数据成员,结果为1。答案:答案:B27实用精品课件PPT14有以下程序:有以下程序:class Testprivate:long x;/ 私有数据成员私有数据成员public:Test(long a): x(a) / 构造函数构造函数friend long Fun(Test s);/ 友元友元;long Fun(Test s)if (s.x = 1 ) return 1;/ 递归结束递归结束else

35、return s.x * Fun(Test(s.x - 1);/ 递归调用递归调用int main()/ 主函数主函数main()int sum = 0;/ 定义变量定义变量for (int i = 0; i 6; i+)sum += Fun(Test(i);/ 累加求和累加求和cout sum endl;/ 输出输出sum return 0; / 返回值返回值0, 返回操作系统返回操作系统运行后的输出结果是运行后的输出结果是 。A)120 B)16 C)154 D)34解析:解析:友元函数友元函数Fun()参数表中的对象在初始化时需执行构造函数参数表中的对象在初始化时需执行构造函数“Test

36、:Test(long a)”,调用过程为:先调用构造函数,调用过程为:先调用构造函数Test(i),使,使Test中中x的值为的值为i,再通过友元函数直接访问,再通过友元函数直接访问Test.x,执行,执行Fun()中的语句,可得到:中的语句,可得到:Fun(Test(0)=1,Fun(Test(1)=1,Fun(Test(2)=2*1,Fun(Test3)=3*2*1=6,Fun(Test(4)=4*3*2*1=24,Fun(Test(5)=5*4*3*2*1=120,sum=1+1+2+6+24+120=154。答案:答案:C28实用精品课件PPT15有以下程序:有以下程序:class T

37、estprivate:int a;/ 数据成员数据成员public:Test() cout 无参构造函数无参构造函数 endl; / 无参构造函数无参构造函数Test(int a) cout a endl; / 带参构造函数带参构造函数Test(const Test ©): a(copy.a) / 复制构造函数复制构造函数 cout 复制构造函数复制构造函数 endl; Test() cout 析构函数析构函数 endl; / 析构函数析构函数;int main()/ 主函数主函数main()Test a(3);/ 定义对象定义对象 return 0; / 返回值返回值0, 返回操作系

38、统返回操作系统运行时的输出结果是运行时的输出结果是 。A)3 B)无参构造函数)无参构造函数C)复制构造函数)复制构造函数D)3 析构函数析构函数 析构函数析构函数 析构函数析构函数解析:解析:创建对象创建对象a时带有参数时带有参数3,故调用构造函数,故调用构造函数Test( int a),输出,输出3并换行;程并换行;程序结束时调用析构函数序结束时调用析构函数Test(),输出,输出“析构函数析构函数”并换行。并换行。答案:答案:D 29实用精品课件PPT16有以下程序:有以下程序:class MyClassprivate:int n;/ 数据成员数据成员public:MyClass(int

39、 m): n(m) / 构造函数构造函数void Print() const cout const:n= n ; / 常成员函数常成员函数void Print() cout n= n ; / 非常成员函数非常成员函数;int main()/ 主函数主函数main()const MyClass obj1(10);/ 常对象常对象MyClass obj2(20);/ 非常对象非常对象obj1.Print();/ 输出信息输出信息obj2.Print();/ 输出信息输出信息cout endl;/ 换行换行 return 0; / 返回值返回值0, 返回操作系统返回操作系统程序的输出结果是程序的输出

40、结果是 。A)n=10 const:n=20B)const:n=10 const:n=20C)const:n=10 n=20D)n=10 n=20解析:解析:根据根据const修饰符选择对应的构造函数,修饰符选择对应的构造函数,objl为常对象,调用常成员函数,为常对象,调用常成员函数,输出输出“const:n=10 ”,obj2为一般对象,调用优先调用非常成员函数,输出为一般对象,调用优先调用非常成员函数,输出“n=20 ”。答案:答案:C30实用精品课件PPT二、填空题二、填空题 1在面向对象方法中,在面向对象方法中, 描述的是具有相同属性与操描述的是具有相同属性与操作的一组对象。作的一组

41、对象。 解析:解析:在面向对象设计中,一个对象是由一些属性和操作构成的。在面向对象设计中,一个对象是由一些属性和操作构成的。对象的属性描述了对象的内部细节。类是具有相同属性和操作的对象的属性描述了对象的内部细节。类是具有相同属性和操作的一组对象的集合,它为属于该类的所有对象提供统一的抽象描述。一组对象的集合,它为属于该类的所有对象提供统一的抽象描述。答案:答案:类类 31实用精品课件PPT2非成员函数应声明为类的非成员函数应声明为类的 函数才能访问这个类的函数才能访问这个类的private成员。成员。 解析:解析:类具有数据封装和隐藏的特性,通常只有类的成员函数才类具有数据封装和隐藏的特性,通

42、常只有类的成员函数才能访问类的私有成员,外部函数只能访问类的公有成员。但在某能访问类的私有成员,外部函数只能访问类的公有成员。但在某些情况下,需要在类的外部访问类的私有成员,这时必须依靠引些情况下,需要在类的外部访问类的私有成员,这时必须依靠引入友元来实现。入友元来实现。答案:答案:友元友元 32实用精品课件PPT3下列程序的输出结果为:下列程序的输出结果为:01试将程序补充完整。试将程序补充完整。class Pointprivate:int x, y;/ 坐标坐标static int count; / 静态数据成员静态数据成员public:Point(int m = 0, int n = 0

43、): x(m), y(n) count+; / 构造函数构造函数Point() count-; / 析构函数析构函数int GetX() const return x; / 返回返回xint GetY() const return y; / 返回返回ystatic void ShowCount() cout count endl; / 输出输出count; / 静态数据成员的初始化静态数据成员的初始化int main()/ 主函数主函数main()Point:ShowCount();/ 输出输出countPoint a(6, 8);/ 定义对象定义对象Point:ShowCount();/ 输

44、出输出countsystem(“PAUSE”); / 调用库函数调用库函数system( ),输出提示信息,输出提示信息return 0; / 返回值返回值0, 返回操作系统返回操作系统。 解析:解析:由第一次调用由第一次调用GetCount()函数输出函数输出count的值为的值为0可知,应将其初始化为可知,应将其初始化为0,再根据静态数据成员的初始化格式:再根据静态数据成员的初始化格式:类型类型 类名类名:静态成员名字静态成员名字 = 值值; 可得横线处填写的语句。可得横线处填写的语句。答案:答案:int Point:count = 0;33实用精品课件PPT4有以下类声明:有以下类声明:

45、class MyClassint i;private:int j;protected:int k;public:int m, n;其中私有成员的数量是其中私有成员的数量是 。解析:解析:在用在用class声明类的成员声明中,如果没有标识成员的访问权限,则声明类的成员声明中,如果没有标识成员的访问权限,则默认为私有的访问权限,故默认为私有的访问权限,故i为私有访问权限。为私有访问权限。答案:答案:2 34实用精品课件PPT5有以下程序:有以下程序:class Integerprivate:int n;/ 数据成员数据成员public:Integer(int n = 0) = n; / 构造函数构

46、造函数void Show() const cout n n 或或 Integer : n 35实用精品课件PPT6有以下程序:有以下程序:class Apublic:A() cout A; / 构造函数构造函数A() cout A; / 析构函数析构函数;int main()/ 主函数主函数main()A *p = new A;/ 定义指针定义指针delete p;/ 释放动态空间释放动态空间cout endl;/ 换行换行system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值0, 返回操作系统返回操作系统程序的输

47、出结果是程序的输出结果是 。解析:解析:创建动态对象时需调用创建动态对象时需调用A的构造函数,输出的构造函数,输出“A”;释放动态对象时,;释放动态对象时,调用调用A的析构函数,输出的析构函数,输出“A”。答案:答案:AA 36实用精品课件PPT三、编程题三、编程题1定义一个满足如下要求的定义一个满足如下要求的Date类。类。(1)用下面的格式输出日期:)用下面的格式输出日期:年年-月月-日日(2)设置日期。)设置日期。并编出应用程序,定义日期对象,设置日期,输出该对象提供的日期。并编出应用程序,定义日期对象,设置日期,输出该对象提供的日期。参考程序参考程序:#include / 编译预处理命

48、令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std class Dateprivate:/ 数据成员数据成员int year;/ 年年int month;/ 月月int day;/ 日日37实用精品课件PPT1定义一个满足如下要求的定义一个满足如下要求的Date类。类。(1)用下面的格式输出日期:)用下面的格式输出日期:年年-月月-日日(2)设置日期。)设置日期。并编出应用程序,定义日期对象,设置日期,输出该对象提供的日期。并编出应用程序,定义日期对象,设置日期,输出该对象提供的日期。参考程序参考程序:public:/ 公有函数公有函数Date(int

49、y = 2010, int m = 1, int d = 1):year(y), month(m), day(d)/ 构造函数构造函数void Set(int y, int m, int d)/ 设置日期设置日期 year = y; month = m; day = d; void Show() const/ 显示日期显示日期 cout year - month - day endl; ;int main()/ 主函数主函数main()Date d;/ 定义对象定义对象d.Show();/ 显示日期显示日期d.Set(2016, 6, 18);/ 设置日期设置日期d.Show();/ 显示日期

50、显示日期system(PAUSE);/ 调用库函数调用库函数system( ),输出提示信息,输出提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统38实用精品课件PPT2定义一个时间类定义一个时间类Time,能提供和设置由时、分、秒组成的时间,并编出,能提供和设置由时、分、秒组成的时间,并编出应用程序,定义时间对象,设置时间,输出该对象提供的时间。应用程序,定义时间对象,设置时间,输出该对象提供的时间。 参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std class Timepr

51、ivate:/ 数据成员数据成员int hour;/ 时时int minute;/ 分分int second;/ 秒秒public:/ 公有函数公有函数Time(int h = 0, int m = 0, int s = 0):/ 构造函数构造函数hour(h), minute(m), second(s)void Set(int h, int m, int s)/ 设置日期设置日期 hour = h; minute = m; second = s; void Show() const/ 显示日期显示日期 cout hour : minute : second endl; ;int main()

52、/ 主函数主函数main()Time t;/ 定义对象定义对象t.Show();/ 显示时间显示时间t.Set(8, 6, 18);/ 设置时间设置时间t.Show();/ 显示时间显示时间system(PAUSE);/ 调用库函数调用库函数system( ),输出提示信息,输出提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统39实用精品课件PPT*3编写设计一个编写设计一个People(人)类。该类的数据成员有姓名(人)类。该类的数据成员有姓名(name)、年龄、年龄(age)、身高、身高(height)、体重、体重(weight)和人数和人数(num),其中人数为静

53、态数据成员,其中人数为静态数据成员,成员函数有构造函数成员函数有构造函数(People)、进食、进食(Eatting)、运动、运动(Sporting)、显示、显示(Show)和显示人数和显示人数(ShowNum)。其中构造函数由已知参数姓名。其中构造函数由已知参数姓名(nm)、年龄、年龄(a)、身高、身高(h)和体重和体重(w)构造对象,进食函数使体重加构造对象,进食函数使体重加1,运动函数使身高加,运动函数使身高加1,显示函数,显示函数用于显示人的姓名、年龄、身高、体重,显示人数函数为静态成员函数,用于用于显示人的姓名、年龄、身高、体重,显示人数函数为静态成员函数,用于显示人数。假设年龄的单

54、位为岁,身高的单位为厘米,体重的单位为市斤,要显示人数。假设年龄的单位为岁,身高的单位为厘米,体重的单位为市斤,要求所有数据成员为求所有数据成员为private访问权限,所有成员函数为访问权限,所有成员函数为public访问权限,在主函访问权限,在主函数中定义若干个对象,通过对象直接访问类的所有非静态成员函数,通过类访数中定义若干个对象,通过对象直接访问类的所有非静态成员函数,通过类访问静态成员函数。问静态成员函数。参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std class Peopleprivat

55、e:/ 数据成员数据成员char name9;/ 姓名姓名int age;/ 年龄年龄int height;/ 身高身高double weight;/ 体重体重static int num;/ 人数人数40实用精品课件PPTpublic:/ 公有函数公有函数People(char nm = 无名氏无名氏, int a = 16, int h = 168, int w = 118):age(a), height(h), weight(w) strcpy(name, nm); num+; void Eatting() weight+; / 进食进食void Sporting() height+;

56、/ 运动运动void Show()const/ 显示信息显示信息 cout 个人信息个人信息: endl;cout 姓名姓名: name endl;cout 年龄年龄: age 岁岁 endl;cout 身高身高: height 厘米厘米 endl;cout 体重体重: weight 市斤市斤 endl endl;static void ShowNum()/ 显示人数显示人数 cout 人数人数: num endl; ;int People:num = 0;/ 初始化静态数据成员初始化静态数据成员num 41实用精品课件PPTint main()/ 主函数主函数main()People p1;

57、/ 定义对象定义对象p1.Show();/ 显示信息显示信息 People p2(李敏李敏, 18, 170, 108);/ 定义对象定义对象p2.Eatting();/ 进食进食p2.Sporting();/ 运动运动p2.Show();/ 显示信息显示信息 People:ShowNum();/ 显示人数显示人数system(PAUSE);/ 调用库函数调用库函数system( ),输出提示信息,输出提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统42实用精品课件PPT*4定义一个描述员工定义一个描述员工(Employee)基本情况的类,数据成员包括编号基本情况的类,

58、数据成员包括编号(num)、姓名姓名(name)、性别、性别(sex)、工资(、工资(wage)、人数)、人数(count)、总工资、总工资(totalWage)。其中姓名定义为长度为其中姓名定义为长度为18的字符数组,性别为为长度为的字符数组,性别为为长度为3的字符数组,其它数的字符数组,其它数据成员类型为整型,总工资和人数为静态数据成员,函数成员包括构造函数、据成员类型为整型,总工资和人数为静态数据成员,函数成员包括构造函数、显示基本数据函数显示基本数据函数(ShowBase)和显示静态数据函数和显示静态数据函数(ShowStatic),其中构造,其中构造函数由已知参数编号函数由已知参数编

59、号(nu) 、姓名、姓名(nm) 、性别、性别(sx)和工资和工资(wg)构造对象,显示基构造对象,显示基本数据函数用于显示学生的编号、姓名、性别和工资,显示静态数据函数为静本数据函数用于显示学生的编号、姓名、性别和工资,显示静态数据函数为静态成员函数,用于显示人数和总工资;要求所有数据成员为态成员函数,用于显示人数和总工资;要求所有数据成员为protected访问权限,访问权限,所有成员函数为所有成员函数为public访问权限,在主函数中定义若干个员工对象,分别显示访问权限,在主函数中定义若干个员工对象,分别显示员工基本信息,以及显示员工人数和总工资。员工基本信息,以及显示员工人数和总工资。

60、 参考程序:参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std class Employeeprotected:/ 数据成员数据成员int num;/ 编号编号char name18;/ 姓名姓名char sex3;/ 姓名姓名int wage;/ 工资工资static int count;/ 人数人数static int totalWage;/ 总工资总工资43实用精品课件PPTpublic:/ 公有函数公有函数Employee(int nu, char nm, char sx, int wg): num(n

61、u), wage(wg) strcpy(name, nm); strcpy(sex, sx); count+; totalWage += wg; ; void ShowBase()/ 显示基本数据显示基本数据 cout 个人基本信息个人基本信息: endl;cout 学号学号: num endl;cout 姓名姓名: name endl;cout 性别性别: sex endl;cout 工资工资: wage 元元 endl endl;static void ShowStatic()/ 显示静态数据显示静态数据 cout 人数人数: count endl;cout 总工资总工资: totalWa

62、ge 元元 endl;int Employee:count = 0;/ 初始化静态数据成员初始化静态数据成员count int Employee:totalWage = 0;/ 初始化静态数据成员初始化静态数据成员totalWage44实用精品课件PPTint main()/ 主函数主函数main()Employee e1(1008, 李杰李杰, 男男, 2680);/ 定义对象定义对象e1.ShowBase();/ 显示基本数据显示基本数据 Employee e2(1009, 李敏李敏, 女女, 2860);/ 定义对象定义对象e2.ShowBase();/ 显示基本数据显示基本数据e2.S

63、howStatic();/ 显示静态数据显示静态数据system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统45实用精品课件PPTC+C+面向对象程序设计教程面向对象程序设计教程第第3章章 模板模板习题解答习题解答46实用精品课件PPT一、选择题一、选择题 1下列关于模板的叙述中,错误的是下列关于模板的叙述中,错误的是 。A)模板声明中的第一个符号总是关键字)模板声明中的第一个符号总是关键字templateB)在模板声明中用)在模板声明中用“”和和“”括起来的部分是模板的类型形参表

64、括起来的部分是模板的类型形参表C)类模板不能有数据成员)类模板不能有数据成员D)在一定条件下函数模板的类型实参可以省略)在一定条件下函数模板的类型实参可以省略解析:解析:由模板声明的格式可知选项由模板声明的格式可知选项A、B正确。在调用模板函数时,如果编正确。在调用模板函数时,如果编译系统从模板函数的类型实参表中得到的信息已经能够判断部分或全部虚拟译系统从模板函数的类型实参表中得到的信息已经能够判断部分或全部虚拟类型参数所对应的实际类型,而且它们又正好是模板形参中最后的若干个参类型参数所对应的实际类型,而且它们又正好是模板形参中最后的若干个参数,则在模板类型实参表中可以省略这几个参数,选项数,

65、则在模板类型实参表中可以省略这几个参数,选项D正确。类模板中可正确。类模板中可以有数据成员,数据成员的类型可以是虚拟类型,也可以是具体类型,选项以有数据成员,数据成员的类型可以是虚拟类型,也可以是具体类型,选项C错误。错误。答案答案:C47实用精品课件PPT2有以下函数模板定义:有以下函数模板定义:template ElemType Fun(const ElemType &x, const ElemType &y) return x * x + y * y; 在下列对在下列对Fun()的调用中,错误的是的调用中,错误的是 。A)Fun(3, 5);B)Fun(3.0, 5.5);C)Fun(3

66、, 5.5);D)Fun(3, 5.5);解析:解析:当从模板函数类型实参表获得的信息有矛盾时,模板类型实参不能省当从模板函数类型实参表获得的信息有矛盾时,模板类型实参不能省略。例如选项略。例如选项C中,编译系统从第一个参数中,编译系统从第一个参数3获得的信息是获得的信息是ElemType对应于对应于int,而从第二个参数,而从第二个参数5.5处获得的信息是处获得的信息是ElemType对应于对应于double,两者相,两者相互矛盾,因此,编译时将产生错误。解决的方法之一是显式给出虚拟类型参互矛盾,因此,编译时将产生错误。解决的方法之一是显式给出虚拟类型参数数ElemType对应的模板类型实参

67、,强制对应的模板类型实参,强制ElemType对应于对应于int。答案:答案:C48实用精品课件PPT3关于关键字关于关键字class和和typename,下列表述中正确的是,下列表述中正确的是 。A)程序中)程序中typename都可以替换为都可以替换为classB)程序中的)程序中的class都可以替换为都可以替换为typenameC)在模板类型形参表中只能用)在模板类型形参表中只能用typename来声明参数的类型来声明参数的类型D)在模板类型形参表中只能用)在模板类型形参表中只能用class或或typename来声明参数的类型来声明参数的类型解析:解析:程序中的程序中的typename

68、都可以替换为都可以替换为class,但程序中的,但程序中的class不可以全不可以全部替换为部替换为typename。例如:在。例如:在“模板类型形参表模板类型形参表”中,关键字中,关键字typename和和class是可以互换的;但是在是可以互换的;但是在“类模板名类模板名”前的关键字前的关键字class代表的含义是代表的含义是类,不可以用类,不可以用typename代替,选项代替,选项B错误。在模板类型形参表中除了错误。在模板类型形参表中除了typename和和class以外也可以用常规类型来声明参数的类型,选项以外也可以用常规类型来声明参数的类型,选项C、D错错误。误。答案:答案:A 4

69、9实用精品课件PPT4有以下函数模板:有以下函数模板:template ElemType Square(const ElemType &x) return x * x; 其中其中ElemType是是 。A)函数形参)函数形参B)函数实参)函数实参C)模板类型形参)模板类型形参D)模板类型实参)模板类型实参解析:解析:由函数模板的定义可知由函数模板的定义可知ElemType为模板类型形参。为模板类型形参。答案:答案:C 50实用精品课件PPT5C+中的模板包括中的模板包括 。A)对象模板和函数模板)对象模板和函数模板B)对象模板和类模板)对象模板和类模板C)函数模板和类模板)函数模板和类模板D)

70、变量模板和对象模板)变量模板和对象模板解析:解析:C+语言通过模板提供了一种将类型参数化的机制,其中包括函数模语言通过模板提供了一种将类型参数化的机制,其中包括函数模板和类模板。板和类模板。答案:答案:C 51实用精品课件PPT二、填空题二、填空题 1已知一个函数模板的声明如下:已知一个函数模板的声明如下:template T1 Fun(T2 n) return n * 5.0; 若要求以若要求以int型数型数7为函数实参调用该模板函数,并返回一个为函数实参调用该模板函数,并返回一个double型数,则型数,则该调用应表示为该调用应表示为 。 解析:解析:当虚拟类型类型参数作为函数的返回值类型

71、,而函数的返回值类型与当虚拟类型类型参数作为函数的返回值类型,而函数的返回值类型与函数参数的类型可以不同时,不管函数类型实参的类型是什么,均不能省略函数参数的类型可以不同时,不管函数类型实参的类型是什么,均不能省略模板类型实参,此题的模板类型实参应为模板类型实参,此题的模板类型实参应为。答案:答案:Fun(7)52实用精品课件PPT2已知已知int dbl(int n ) return n + n; 和和long dbl(long n) return n + n; 是一个函数模板的两个实例,则该函数模板的声明是是一个函数模板的两个实例,则该函数模板的声明是template 解析:解析:将类型将

72、类型int和和long参数化,用模板类型参数参数化,用模板类型参数ElemType代替,可得该函代替,可得该函数模板。数模板。答案答案:ElemType Dbl(ElemType n ) return n + n; 53实用精品课件PPT3下面程序的运行结果是下面程序的运行结果是 。template ElemType Min(const ElemType &a, const ElemType &b)/ 求求a,b的最小值的最小值if (a b) return a;/ a更小更小else return b;/ b更小更小int main()/ 主函数主函数main()int n1 = 4, n2

73、 = 5;/ 定义整型变量定义整型变量double d1 = 0.35, d2 = 4.4;/ 定义实型变量定义实型变量cout 最小整数最小整数= Min(n1, n2) , 最小实型最小实型= Min(d1, d2) endl;/ 输出信息输出信息system(PAUSE); / 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值0, 返回操作系统返回操作系统 解析:解析:模板函数模板函数Min()根据调用它的实参类型的不同,生成不同的函数版本,根据调用它的实参类型的不同,生成不同的函数版本,例如,返回两个例如,返回两个int型数的最小值

74、或返回两个型数的最小值或返回两个double型数的最小值。型数的最小值。答案答案:最小整数最小整数=4,最小实型最小实型=0.3554实用精品课件PPT三、编程题三、编程题 1试使用函数模板实现输出一个数组各元素的值,要求编写测试程序。试使用函数模板实现输出一个数组各元素的值,要求编写测试程序。 参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std template void Display(ElemType a, int n)/ 输出数组输出数组a各元素之值各元素之值for (int i = 0; i

75、n; i+)cout ai ;/ 输出输出aicout endl;/ 换行换行int main()/ 主函数主函数main()int a = 1, 2, 3, 4, 5, 6, 7, 8, 9;/ 定义数组定义数组Display(a, 9);/ 输出输出asystem(PAUSE);/ 调用库函数调用库函数system( ),输出系统信息,输出系统信息return 0; / 返回值返回值, 返回操作系统返回操作系统55实用精品课件PPT2编写一个复数类模板编写一个复数类模板Complex,其数据成员,其数据成员real和和image的类型未知,定义的类型未知,定义相应的成员函数,包括构造函数、

76、输出复数值的函数、求复数和的函数和求复数相应的成员函数,包括构造函数、输出复数值的函数、求复数和的函数和求复数差的函数,主函数中定义模板类对象,分别以差的函数,主函数中定义模板类对象,分别以int和和double实例化类型参数。实例化类型参数。 参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std / 声明复数类模板声明复数类模板template class Complexprivate:/ 数据成员数据成员ElemType real;/ 实部实部ElemType image;/ 虚部虚部public:/

77、 公有函数公有函数Complex(ElemType r = 0, ElemType i = 0): real(r), image(i) void Show() const;/ 输出复数输出复数static Complex Add(const Complex &z1, const Complex &z2); static Complex Sub(const Complex &z1, const Complex &z2);56实用精品课件PPTtemplate void Complex:Show() const/ 输出复数输出复数if (image 0) cout real image i end

78、l;/虚部为负虚部为负,例如例如-5ielse if (image = 0) cout real endl;/ 虚部为虚部为0,例如例如3else cout real “+” image “i” endl;/ 虚部为虚部为正正,例如例如+5itemplate Complex Complex:Add(const Complex &z1,const Complex &z2)/ 复数加法复数加法 Complex z(z1.real + z2.real, z1.image + z2.image);/ 定义复数对象定义复数对象return z;/ 返回复数返回复数template Complex Com

79、plex:Sub(const Complex &z1,const Complex &z2)/ 复数减法复数减法 Complex z(z1.real - z2.real, z1.image - z2.image);/ 定义复数对象定义复数对象return z;/ 返回复数返回复数57实用精品课件PPTint main()/ 主函数主函数main()Complex z1(2, 3), z2(6, -5), z3;/ 定义复数对象定义复数对象z1.Show();/ 输出输出z1z2.Show();/ 输出输出z2z3 = Complex:Add(z1, z2);/ z3=z1+z2z3.Show()

80、;/ 输出输出z3z3 = Complex:Sub(z1, z2);/ z3=z1-z2z3.Show();/ 输出输出z3Complex z4(2.1, 3.8), z5(6.8, -5.1), z6;/ 定义复数对象定义复数对象z4.Show();/ 输出输出z4z5.Show();/ 输出输出z5z6 = Complex:Add(z4, z5);/ z6=z4+z5z6.Show();/ 输出输出z3z6 = Complex:Sub(z4, z5);/ z6=z4-z5z6.Show();/ 输出输出z6system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示

81、信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统58实用精品课件PPT*3编写一个使用数组类模板编写一个使用数组类模板Array对数组求最大值和求元素和的程序,要求编对数组求最大值和求元素和的程序,要求编写出测试程序。写出测试程序。 参考程序:参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std / 声明数组类模板声明数组类模板template class Arrayprivate:/ 数据成员数据成员ElemType *elem;/ 存储数据元素值存储数据元素值int si

82、ze;/ 数组元素个数数组元素个数public:/ 公有函数公有函数Array(int sz): size(sz) elem = new ElemTypesize; / 构造函数构造函数Array() delete elem; / 析构函数析构函数void SetElem(ElemType e, int i);/ 设置元素值设置元素值ElemType GetElem(int i) const;/ 求元素值求元素值ElemType Max() const;/ 求最大值求最大值ElemType Sum() const;/ 求元素之和求元素之和;59实用精品课件PPTtemplate void Ar

83、ray:SetElem(ElemType e, int i)/ 设置元素值设置元素值 if (i = size)cout 元素位置错元素位置错! endl;exit(1);/ 退出程序的运行退出程序的运行,返回到操作系统返回到操作系统elemi = e;/ 设置元素值为设置元素值为etemplate ElemType Array:GetElem(int i) const/ 求元素值求元素值 if (i = size)cout 元素位置错元素位置错! endl;exit(2);/ 退出程序的运行退出程序的运行,返回到操作系统返回到操作系统return elemi;/ 返回元素值返回元素值elem

84、i60实用精品课件PPTtemplate ElemType Array:Max() const/ 求最大值求最大值ElemType m = elem0;/ 设设elem0最大最大for (int i = 1; i m) m = elemi;/ 依次比较求最大值依次比较求最大值return m;/ 返回最大值返回最大值template ElemType Array:Sum() const/ 求元素之和求元素之和ElemType s = 0;/ 定义变量定义变量for (int i = 1; i size; i+)s = s + elemi;/ 依次求和依次求和return s;/ 返回和返回和6

85、1实用精品课件PPTint main()/ 主函数主函数main()int a = 1, 9, 7, 5, 6, 3;/ 定义数组定义数组aint n = 6;/ 数组元素个数数组元素个数Array obj(n);/ 定义数组对象定义数组对象int i;/ 定义变量定义变量for (i = 0; i n; i+)obj.SetElem(ai, i);/ 设置数组元素值设置数组元素值for (i = 0; i n; i+)cout obj.GetElem(i) ;/ 输出元素值输出元素值cout endl;/ 换行换行cout 最大值为最大值为: obj.Max() endl;/ 输出最大值输出

86、最大值cout 各元素和为各元素和为: obj.Sum() endl;/ 输出各元素之和输出各元素之和system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统62实用精品课件PPT*4对数组求最大值和求元素和的算法都编写为函数模板,要求编写出测试程对数组求最大值和求元素和的算法都编写为函数模板,要求编写出测试程序。序。 参考程序:参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std template

87、ElemType Max(ElemType a, int n)/ 求最大值求最大值ElemType m = a0;/ 设设a0最大最大for (int i = 1; i m) m = ai;/ 依次比较求最大值依次比较求最大值return m;/ 返回最大值返回最大值template ElemType Sum(ElemType a, int n)/ 求元素之和求元素之和ElemType s = 0;/ 定义变量定义变量for (int i = 1; i n; i+)s = s + ai;/ 依次求和依次求和return s;/ 返回和返回和63实用精品课件PPT*4对数组求最大值和求元素和的算

88、法都编写为函数模板,要求编写出测试程对数组求最大值和求元素和的算法都编写为函数模板,要求编写出测试程序。序。 参考程序:参考程序:int main()/ 主函数主函数main()int a = 1, 9, 7, 5, 6, 3;/ 定义数组定义数组aint n = 6;/ 数组元素个数数组元素个数for (int i = 0; i n; i+)cout ai ;/ 输出元素值输出元素值cout endl;/ 换行换行cout 最大值为最大值为: Max(a, n) endl;/ 输出最大值输出最大值cout 各元素和为各元素和为: Sum(a, n) endl;/ 输出各元素之和输出各元素之和

89、system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统64实用精品课件PPT*5对数组求最大值和求元素和的函数采用静态成员函数的方式封装成数组对数组求最大值和求元素和的函数采用静态成员函数的方式封装成数组算法类模板算法类模板ArrayAlg,要求编写出测试程序。,要求编写出测试程序。 参考程序:参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std / 声明数组类模板声明数组类模板template c

90、lass ArrayAlgpublic:/ 公有函数公有函数static ElemType Max(ElemType a, int n)/ 求最大值求最大值ElemType m = a0;/ 设设a0最大最大for (int i = 1; i m) m = ai;/ 依次比较求最大值依次比较求最大值return m;/ 返回最大值返回最大值static ElemType Sum(ElemType a, int n)/ 求元素之和求元素之和ElemType s = 0;/ 定义变量定义变量for (int i = 1; i n; i+)s = s + ai;/ 依次求和依次求和return s;

91、/ 返回和返回和;65实用精品课件PPT*5对数组求最大值和求元素和的函数采用静态成员函数的方式封装成数组对数组求最大值和求元素和的函数采用静态成员函数的方式封装成数组算法类模板算法类模板ArrayAlg,要求编写出测试程序。,要求编写出测试程序。 参考程序:参考程序:int main()/ 主函数主函数main()int a = 1, 9, 7, 5, 6, 3;/ 定义数组定义数组aint n = 6;/ 数组元素个数数组元素个数for (int i = 0; i n; i+)cout ai ;/ 输出元素值输出元素值cout endl;/ 换行换行cout 最大值为最大值为: Array

92、Alg:Max(a, n) endl;cout 各元素和为各元素和为: ArrayAlg:Sum(a, n) endl;system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统66实用精品课件PPTC+C+面向对象程序设计教程面向对象程序设计教程第第4 4章章 运算符重载运算符重载习题解答习题解答 67实用精品课件PPT一、选择题一、选择题 1通过运算符重载,可以改变运算符原有的通过运算符重载,可以改变运算符原有的 。A)操作数类型)操作数类型B)操作数个数)操作数个数C)优先级)

93、优先级D)结合性)结合性解析:解析:通过运算符重载可以改变运算符原有的操作数类型,但是不能改变运通过运算符重载可以改变运算符原有的操作数类型,但是不能改变运算符操作数的个数以及优先级和结合性。算符操作数的个数以及优先级和结合性。答案:答案:A 68实用精品课件PPT2运算符重载是对已有的运算符赋予多重含义,因此运算符重载是对已有的运算符赋予多重含义,因此 。A)可以对基本类型(如)可以对基本类型(如int类型)的数据,重新定义类型)的数据,重新定义“+”运算符的含义运算符的含义B)可以改变一个已有运算符的优先级和操作数个数)可以改变一个已有运算符的优先级和操作数个数C)只能重载)只能重载C+中

94、已经有的运算符,不能定义新运算符中已经有的运算符,不能定义新运算符D)C+中已经有的所有运算符都可以重载中已经有的所有运算符都可以重载 解析:解析:重载运算符的函数的参数不能全部是重载运算符的函数的参数不能全部是C+的标准类型,例如,不能改的标准类型,例如,不能改变运算符变运算符“+”作用于两个作用于两个int型数的含义,即运算符函数的参数中至少存在型数的含义,即运算符函数的参数中至少存在一个用户自定义对象,故选项一个用户自定义对象,故选项A错误。运算符重载不能改变运算符原有的优错误。运算符重载不能改变运算符原有的优先级和结合性,选项先级和结合性,选项B错误。错误。“?:?:”不能重载,选项不

95、能重载,选项D错误。错误。答案:答案:C69实用精品课件PPT3下列关于运算符重载的描述中,正确的是下列关于运算符重载的描述中,正确的是 。A)运算符重载为成员函数时,若参数表中无参数,重载的一定是一元运算)运算符重载为成员函数时,若参数表中无参数,重载的一定是一元运算符符B)一元运算符只能作为成员函数重载)一元运算符只能作为成员函数重载C)二元运算符作为非成员函数重载时,参数表中只有一个参数)二元运算符作为非成员函数重载时,参数表中只有一个参数D)C+中可以重载所有的运算符中可以重载所有的运算符 解析:解析:有些一元运算符既可以作为成员函数重载,也可以作为友元函数或普有些一元运算符既可以作为

96、成员函数重载,也可以作为友元函数或普通函数重载,如取负运算符通函数重载,如取负运算符“-”,故选项,故选项B错误。运算符重载为非成员函数错误。运算符重载为非成员函数时,所有的操作数必须出现在参数表中,故二元运算符参数表中有两个参数,时,所有的操作数必须出现在参数表中,故二元运算符参数表中有两个参数,选项选项C错误。错误。C+存在有运算符不能被重载,选项存在有运算符不能被重载,选项D错误。错误。答案:答案:A 70实用精品课件PPT4在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该在重载一个运算符为成员函数时,其参数表中没有任何参数,这说明该运算符是运算符是 。A)后缀一元运算符)

97、后缀一元运算符B)前缀一元运算符)前缀一元运算符C)无操作数的运算符)无操作数的运算符D)二元运算符)二元运算符 解析:解析:重载一个运算符为成员函数时,对象本身作为一个参数,故二元运算重载一个运算符为成员函数时,对象本身作为一个参数,故二元运算符有一个参数。当重载后缀一元运算符时,需要增加一个实际并不使用的整符有一个参数。当重载后缀一元运算符时,需要增加一个实际并不使用的整型参数,以示区别。故只有前缀一元运算符才没有任何参数。型参数,以示区别。故只有前缀一元运算符才没有任何参数。答案:答案:B 71实用精品课件PPT二、填空题二、填空题 1若以非成员函数形式为类若以非成员函数形式为类MyCl

98、ass重载重载“!”运算符,其操作结果为一运算符,其操作结果为一个个bool型数,则该运算符重载函数的原型是型数,则该运算符重载函数的原型是 。 解析:解析:以非成员函数形式重载一元运算符以非成员函数形式重载一元运算符“!”,一定含有一个参数,此处,一定含有一个参数,此处为类为类MyClass的常引用。的常引用。答案:答案:bool operator!( const MyClass &);72实用精品课件PPT2若将一个二元运算符重载为类的成员函数,其形参个数应该是若将一个二元运算符重载为类的成员函数,其形参个数应该是 个。个。解析:解析:运算符重载函数作为成员函数时,第一个操作数就是对象本身

99、,并不运算符重载函数作为成员函数时,第一个操作数就是对象本身,并不显式出现在参数表中,所以二元运算符重载为类的成员函数时,形参个数为显式出现在参数表中,所以二元运算符重载为类的成员函数时,形参个数为一个。一个。答案:答案:1 73实用精品课件PPT3运算符重载使用的关键字是运算符重载使用的关键字是 。 解析:解析:运算符重载函数名为运算符重载函数名为“operator运算符运算符”,可知,可知operator是运算符重是运算符重载使用的关键字。载使用的关键字。答案:答案:operator74实用精品课件PPT三、编程题三、编程题 1定义一个复数类定义一个复数类Complex,重载运算符,重载运

100、算符“+”,“-”,“*”,使之能用于,使之能用于复数的加、减、乘。编程序,分别求两个复数之和、差与积。复数的加、减、乘。编程序,分别求两个复数之和、差与积。 参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std / 声明复数类声明复数类class Complexprivate:/ 数据成员数据成员double real;/ 实部实部double image;/ 虚部虚部75实用精品课件PPT1定义一个复数类定义一个复数类Complex,重载运算符,重载运算符“+”,“-”,“*”,使之能用于,使之能用于

101、复数的加、减、乘。编程序,分别求两个复数之和、差与积。复数的加、减、乘。编程序,分别求两个复数之和、差与积。 public:/ 公有函数公有函数Complex(double r = 0, double i = 0): real(r), image(i) / 构造函数构造函数void Show() const;/ 输出复数输出复数double GetReal() const return real; / 返回实部返回实部double GetImage() const return image; / 返回虚部返回虚部void SetReal(double rl) real = rl; / 设置实部

102、设置实部void SetImage(double ig) image = ig; / 设置虚部设置虚部;void Complex:Show() const/ 输出复数输出复数if (image 0) cout real image i endl;/ 虚部为负虚部为负else if (image = 0) cout real endl;/ 虚部为虚部为0else cout real “+” image “i” endl;/ 虚部为虚部为正正76实用精品课件PPT1定义一个复数类定义一个复数类Complex,重载运算符,重载运算符“+”,“-”,“*”,使之能用于,使之能用于复数的加、减、乘。编程

103、序,分别求两个复数之和、差与积。复数的加、减、乘。编程序,分别求两个复数之和、差与积。 Complex operator+(const Complex &a, const Complex &b) / 重载加法运算符重载加法运算符+,两个操作数都是对象两个操作数都是对象 Complex z(a.GetReal() + b.GetReal(), a.GetImage() + b.GetImage();/ 定义复数对象定义复数对象return z;/ 返回和返回和Complex operator-(const Complex &a, const Complex &b) / 重载加法运算符重载加法运算

104、符-,两个操作数都是对象两个操作数都是对象 Complex sub(a.GetReal() - b.GetReal(), a.GetImage() - b.GetImage();/ 定义差对象定义差对象return sub;/ 返回和返回和77实用精品课件PPT1定义一个复数类定义一个复数类Complex,重载运算符,重载运算符“+”,“-”,“*”,使之能用于,使之能用于复数的加、减、乘。编程序,分别求两个复数之和、差与积。复数的加、减、乘。编程序,分别求两个复数之和、差与积。 Complex operator*(const Complex &a, const Complex &b) / 重

105、载加法运算符重载加法运算符-,两个操作数都是对象两个操作数都是对象 Complex z;/ 定义复数对象定义复数对象z.SetReal(a.GetReal() * b.GetReal() - a.GetImage() * b.GetImage();/ 设置实部设置实部z.SetImage(a.GetReal()*b.GetImage()+a.GetImage()*b.GetReal();/ 设置虚部设置虚部return z;/ 返回积返回积78实用精品课件PPT1定义一个复数类定义一个复数类Complex,重载运算符,重载运算符“+”,“-”,“*”,使之能用于,使之能用于复数的加、减、乘。编

106、程序,分别求两个复数之和、差与积。复数的加、减、乘。编程序,分别求两个复数之和、差与积。 int main()/ 主函数主函数main()Complex z1(2, 3), z2(6, -5), z3;/ 定义复数对象定义复数对象z1.Show();/ 输出输出z1z2.Show();/ 输出输出z2z3 =z1 + z2;/ z3=z1+z2z3.Show();/ 输出输出z3z3 = z1 - z2;/ z3=z1-z2z3.Show();/ 输出输出z3z3 = z1 * z2;/ z3=z1*z2z3.Show();/ 输出输出z3system(PAUSE);/ 调用库函数调用库函数s

107、ystem( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统79实用精品课件PPT2设计一个日期类设计一个日期类Date,,要求:,要求:(1)包含年)包含年(year)、月、月(month)和日和日(day)私有数据成员。私有数据成员。(2)包含构造函数,重载输出运算符)包含构造函数,重载输出运算符“”。参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std class Dateprivate:/ 数据成员数据成员int year;/ 年年int m

108、onth;/ 月月int day;/ 日日public:/ 公有函数公有函数Date(int y = 2010, int m = 1, int d = 1):year(y), month(m), day(d)void SetYear(int y) year = y; / 设置年设置年void SetMonth(int m) month = m; / 设置月设置月void SetDay(int d) day = d; / 设置日设置日int GetYear() const return year; / 返回年返回年int GetMonth() const return month; / 返回月返

109、回月int GetDay() const return day; / 返回日返回日;80实用精品课件PPT2设计一个日期类设计一个日期类Date,,要求:,要求:(1)包含年)包含年(year)、月、月(month)和日和日(day)私有数据成员。私有数据成员。(2)包含构造函数,重载输出运算符)包含构造函数,重载输出运算符“”。istream &operator(istream &in, Date &dt)/ 重载输入运算符重载输入运算符int y, m, d;/ 表示年表示年(y),月月(m)和日和日(d)cout y;/ 输入年输入年cout m;/ 输入月输入月cout d;/ 输入日

110、输入日dt.SetYear(y);/ 设置年设置年dt.SetMonth(m);/ 设置月设置月dt.SetDay(d);/ 设置日设置日return in;/ 返回输入流对象返回输入流对象81实用精品课件PPT2设计一个日期类设计一个日期类Date,,要求:,要求:(1)包含年)包含年(year)、月、月(month)和日和日(day)私有数据成员。私有数据成员。(2)包含构造函数,重载输出运算符)包含构造函数,重载输出运算符“”。ostream &operator(ostream &out, const Date &dt)/重载运算符重载运算符cout dt.GetYear() 年年 dt

111、.GetMonth() 月月 dt.GetDay() d;/ 输入日期输入日期cout d endl;/ 输出日期输出日期system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统82实用精品课件PPT*3设计一个时间类设计一个时间类Time,要求:,要求:(1)包含时)包含时(hour)、分、分(minute)和秒和秒(second)私有数据成员。私有数据成员。(2)包含构造函数,重载关于一时间加上另一时间的加法运算符)包含构造函数,重载关于一时间加上另一时间的加法运算符“+ ”、

112、重载、重载输出运算符输出运算符“”。 参考程序:参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std class Timeprivate:/ 数据成员数据成员int hour;/ 时时int minute;/ 月月int second;/ 秒秒public:/ 公有函数公有函数Time(int h = 0, int m = 0, int s = 0):hour(h), minute(m), second(s)/ 构造函数构造函数void SetHour(int h) hour = h; / 设置时设置时void

113、SetMinute(int m) minute = m; / 设置分设置分void SetSecond(int s) second = s; / 设置秒设置秒int GetHour() const return hour; / 返回时返回时int GetMinute() const return minute; / 返回分返回分int GetSecond() const return second; / 返回秒返回秒;83实用精品课件PPT*3设计一个时间类设计一个时间类Time,要求:,要求:(1)包含时)包含时(hour)、分、分(minute)和秒和秒(second)私有数据成员。私有数

114、据成员。(2)包含构造函数,重载关于一时间加上另一时间的加法运算符)包含构造函数,重载关于一时间加上另一时间的加法运算符“+ ”、重载、重载输出运算符输出运算符“”。 istream &operator(istream &in, Time &t)/ 重载输入运算符重载输入运算符int h, m, s;/ 表示时表示时(h),分分(m)和秒和秒(s)cout h;/ 输入时输入时cout m;/ 输入分输入分cout s;/ 输入秒输入秒t.SetHour(h);/ 设置时设置时t.SetMinute(m);/ 设置分设置分t.SetSecond(s);/ 设置秒设置秒return in;/ 返

115、回输入流对象返回输入流对象84实用精品课件PPT*3设计一个时间类设计一个时间类Time,要求:,要求:(1)包含时)包含时(hour)、分、分(minute)和秒和秒(second)私有数据成员。私有数据成员。(2)包含构造函数,重载关于一时间加上另一时间的加法运算符)包含构造函数,重载关于一时间加上另一时间的加法运算符“+ ”、重载、重载输出运算符输出运算符“”。 ostream &operator(ostream &out, const Time &t)/ 重载运算符重载运算符cout t.GetHour() : t.GetMinute() : t.GetSecond();return

116、out;/ 返回输出流对象返回输出流对象Time operator+(const Time &a, const Time &b)/ 重载加法运算符重载加法运算符+int s = 3600 * a.GetHour() + 60 * a.GetMinute() + a.GetSecond() + 3600 * b.GetHour() + 60 * b.GetMinute() + b.GetSecond();Time t;/ 定义地象定义地象t.SetHour(s / 3600);/ 设置时设置时s = s % 3600;/ 去掉时占用的时间去掉时占用的时间t.SetMinute(s / 60);/

117、 设置分设置分t.SetSecond(s % 60);/ 设置秒设置秒return t;/ 返回时间返回时间85实用精品课件PPT*3设计一个时间类设计一个时间类Time,要求:,要求:(1)包含时)包含时(hour)、分、分(minute)和秒和秒(second)私有数据成员。私有数据成员。(2)包含构造函数,重载关于一时间加上另一时间的加法运算符)包含构造函数,重载关于一时间加上另一时间的加法运算符“+ ”、重载、重载输出运算符输出运算符“”。 int main()/ 主函数主函数main()Time t1, t2;/ 定义对象定义对象 cout 输入输入t1: t1;/ 输入输入t1co

118、ut t1 endl;/ 输出输出t1cout 输入输入t2: t2;/ 输入输入t2cout t2 endl;/ 输出输出t2cout t1+t2: t1 + t2 endl;/ 输出输出t1 + t2system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统86实用精品课件PPTC+C+面向对象程序设计教程面向对象程序设计教程第第5 5章章 继承继承习题解答习题解答87实用精品课件PPT一、选择题一、选择题 1有以下程序:有以下程序:class Apublic:A() cout

119、A; / 构造函数构造函数;class B: public Apublic:B() cout B; / 构造函数构造函数;int main(void)/ 主函数主函数main()B obj;/ 定义对象定义对象cout endl;/ 换行换行 return 0; / 返回值返回值0, 返回操作系统返回操作系统执行后的输出结果是执行后的输出结果是 。A)AB B)BA C)A D)B 解析:解析:根据派生类构造函数的执行顺序,首先执行基类根据派生类构造函数的执行顺序,首先执行基类A的构造函数的构造函数A(),输出,输出结果结果“A”;再执行派生类;再执行派生类B的构造函数的构造函数B(),输出结

120、果,输出结果“B”。故最终输出结果。故最终输出结果是是“AB”。答案:答案:A 88实用精品课件PPT2有以下程序:有以下程序:class Apublic:A() cout A; / 析构函数析构函数;class B: public Apublic:B() cout B; / 析构函数析构函数;int main()/ 主函数主函数main()B *p = new B;/ 定义指针定义指针delete p;/ 释放动态空间释放动态空间cout endl;/ 换行换行return 0; / 返回值返回值0, 返回操作系统返回操作系统执行后的输出结果是执行后的输出结果是 。A)AB B)BA C)A

121、 D)B 解析:解析:根据派生类析构函数的执行顺序,首先执行派生类根据派生类析构函数的执行顺序,首先执行派生类B的析构函数,输出的析构函数,输出结果结果“B”;再执行基类的析构函数,输出结果;再执行基类的析构函数,输出结果“A”。故最终的输出结果是。故最终的输出结果是“BA”。答案:答案:B 89实用精品课件PPT3有以下程序:有以下程序:class Apublic:A() cout A; / 构造函数构造函数A() cout A; / 析构函数析构函数;class B: public Apublic:B() cout B; / 构造函数构造函数B() cout B; / 析构函数析构函数;i

122、nt main()/ 主函数主函数main()B *p = new B;/ 定义指针定义指针delete p;/ 释放动态空间释放动态空间cout endl;/ 换行换行return 0; / 返回值返回值0, 返回操作系统返回操作系统程序的输出结果是程序的输出结果是 。A)BAABB)ABBAC)BABAD)ABBA 解析:解析:根据派生类构造函数的执行顺序,首先执行基类根据派生类构造函数的执行顺序,首先执行基类A的构造函数的构造函数A(),输出,输出结果结果“A”。接下来执行派生类。接下来执行派生类B的构造函数体:先输出的构造函数体:先输出“B”;再根据析构函;再根据析构函数的执行顺序,先

123、调用派生类的析构函数,输出数的执行顺序,先调用派生类的析构函数,输出“B”,然后调用基类的析构,然后调用基类的析构函数,输出函数,输出“A”。答案:答案:B 90实用精品课件PPT4下列有关继承和派生的叙述中,正确的是下列有关继承和派生的叙述中,正确的是 。A)如果一个派生类私有继承其基类,则该派生类不能访问基类的保护成员)如果一个派生类私有继承其基类,则该派生类不能访问基类的保护成员B)派生类的成员函数可以访问基类的所有成员)派生类的成员函数可以访问基类的所有成员C)基类对象可以赋值给派生类对象)基类对象可以赋值给派生类对象D)派生类对象可以赋值给基类对象)派生类对象可以赋值给基类对象解析:

124、解析:选项选项A中,如果一个派生类私有继承其基类,则该基类的保护成员成为中,如果一个派生类私有继承其基类,则该基类的保护成员成为派生类的私有成员,可以被派生类所访问。选项派生类的私有成员,可以被派生类所访问。选项B中,派生类的成员函数只能中,派生类的成员函数只能访问到基类的公有成员和保护成员。选项访问到基类的公有成员和保护成员。选项C中,基类对象无法赋值给派生类对中,基类对象无法赋值给派生类对象。象。答案:答案:D91实用精品课件PPT5有以下程序:有以下程序:class Apublic:A() cout A; / 无参构造函数无参构造函数A(char c) cout c; / 带参构造函数带

125、参构造函数;class B: public Apublic:B(char c) cout c; / 带参构造函数带参构造函数;int main()/ 主函数主函数main()B obj(B);/ 定义对象定义对象cout endl;/ 换行换行return 0; / 返回值返回值0, 返回操作系统返回操作系统执行这个程序,屏幕上将显示输出执行这个程序,屏幕上将显示输出 。A)B B)BA C)AB D)BB 解析:解析:本题考查派生类中构造函数的调用顺序。首先执行基类本题考查派生类中构造函数的调用顺序。首先执行基类A的构造函数的构造函数A(),翰出结果,翰出结果“A”;然后执行派生类;然后执行

126、派生类B的构造函数的构造函数B(char c),输出结果,输出结果“B”。答案:答案:C 92实用精品课件PPT6下列关于派生类构造函数和析构函数的说法中,错误的是下列关于派生类构造函数和析构函数的说法中,错误的是 。A)派生类的构造函数会隐含调用基类的构造函数)派生类的构造函数会隐含调用基类的构造函数B)如果基类中有默认构造函数(无参构造函数),那么派生类可以不定义构)如果基类中有默认构造函数(无参构造函数),那么派生类可以不定义构造函数造函数C)在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数)在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数D)在销毁派生类

127、对象时,先调用基类的析构函数,再调用派生类的析构函数)在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数 解析:解析:派生类中构造函数的执行遵循的顺序为:先调用基类的构造函数,最后派生类中构造函数的执行遵循的顺序为:先调用基类的构造函数,最后执行派生类构造函数。在销毁派生类对象时,析构函数的调用顺序与构造函数执行派生类构造函数。在销毁派生类对象时,析构函数的调用顺序与构造函数的调用顺序相反,应该是先调用派生类的析构函数,再调用基类的析构函数。的调用顺序相反,应该是先调用派生类的析构函数,再调用基类的析构函数。答案:答案:D 93实用精品课件PPT7如果派生类以如果派生类以prot

128、ected方式继承基类,则原基类的方式继承基类,则原基类的protected成员和成员和public成员在派生类的访问权限分别是成员在派生类的访问权限分别是 。A)public和和public B)public和和protected C)protected和和public D)protected和和protected 解析:解析:通过通过protected方式继承基类后,原基类的私有成员不可访问,而方式继承基类后,原基类的私有成员不可访问,而protected和和public成员均变成成员均变成protected成员。成员。答案:答案:D 94实用精品课件PPT8派生类的成员函数不能访问基类的

129、派生类的成员函数不能访问基类的 。A)公有成员和保护成员)公有成员和保护成员B)公有成员)公有成员C)私有成员)私有成员D)保护成员)保护成员 解析:解析:无论派生类采用何种继承方式,都不能访问基类的私有成员。无论派生类采用何种继承方式,都不能访问基类的私有成员。答案:答案:C 95实用精品课件PPT9有以下程序:有以下程序:class Apublic:A(int x = 0) cout x; / 构造函数构造函数;class B: public Apublic:B(int x = 0) cout x; / 构造函数构造函数;int main()/ 主函数主函数main()B obj(1);/

130、 定义对象定义对象cout endl;/ 换行换行return 0; / 返回值返回值0, 返回操作系统返回操作系统程序的输出结果是程序的输出结果是 。A)0 B)1 C)01 D)001 解析:解析:根据派生类构造函数的执行顺序,首先执行基类根据派生类构造函数的执行顺序,首先执行基类A的构造函数,由于没的构造函数,由于没有参数传递,故使用默认值有参数传递,故使用默认值0,输出,输出x的值的值“0”;再执行派生类的构造函数,;再执行派生类的构造函数,输出输出“1”。最终输出。最终输出“01”。答案:答案:C 96实用精品课件PPT二、填空题二、填空题 1派生类中的成员不能直接访问基类中的派生类

131、中的成员不能直接访问基类中的 成员。成员。 解析:解析:无论采用何种继承方式,派生类中的成员都不能直接访问基类中的私有无论采用何种继承方式,派生类中的成员都不能直接访问基类中的私有成员。成员。答案:答案:私有私有 97实用精品课件PPT2将下列类的定义补充完整。将下列类的定义补充完整。class Apublic:void Show(int x = 0) const cout x; / 输出信息输出信息;class B: public Apublic:void Show(int x = 0) const/ 输出信息输出信息 / 显式调用基类的函数显式调用基类的函数Show()cout x end

132、l;/ 输出输出y;int main()/ 主函数主函数main()B obj;/ 定义对象定义对象obj.Show(1);/ 输出信息输出信息 system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值0, 返回操作系统返回操作系统解析:解析:由于派生类有同名函数,要调用基类的函数由于派生类有同名函数,要调用基类的函数Show()必须用作用域运算必须用作用域运算符符“:”来说明。来说明。答案:答案:A:Show();98实用精品课件PPT3在声明派生类时,如果不显式给出继承方式,默认的类继承方式是私有继在声明派生类时

133、,如果不显式给出继承方式,默认的类继承方式是私有继承承private.已知有以下类定义:已知有以下类定义:class Aprotected:void Fun() ;class B: A ;则类则类A中的成员函数中的成员函数Fun()在类在类B中的访问权限是中的访问权限是 (注意:要求填(注意:要求填写写private, protected或或public中的一项)。中的一项)。 解析:解析:当不显式给出继承方式时,默认的类继承方式是私有继承。而私有继承当不显式给出继承方式时,默认的类继承方式是私有继承。而私有继承将使得基类中的保护成员和私有成员的在派生类中变为访私有成员。将使得基类中的保护成员

134、和私有成员的在派生类中变为访私有成员。答案:答案:private 99实用精品课件PPT4对基类数据成员的初始化必须在派生类构造函数中的对基类数据成员的初始化必须在派生类构造函数中的 处进行。处进行。 解析:解析:对基类数据成员的初始化不能在派生类构造函数的函数体中进行,必须对基类数据成员的初始化不能在派生类构造函数的函数体中进行,必须在派生类构造函数的参数初始化表处用基类构造函数的方式进行,实质是调用在派生类构造函数的参数初始化表处用基类构造函数的方式进行,实质是调用基类的构造函数。基类的构造函数。答案:答案:参数初始化表参数初始化表 100实用精品课件PPT5有以下程序:有以下程序:cla

135、ss Apublic:A() cout A; / 构造函数构造函数A() cout A; / 析构函数析构函数;class Bprivate:A a;/ 数据成员数据成员public:B() cout B; / 构造函数构造函数B() cout B; / 析构函数析构函数;int main()/ 主函数主函数main()B *p = new B;/ 定义指针定义指针delete p;/ 释放动态空间释放动态空间cout endl;/ 换行换行system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值0, 返回操作系统返

136、回操作系统程序的输出结果是程序的输出结果是 。 解析:解析:由于类由于类B中有类中有类A的对象作为成员对象,创建动态对象时需调用的对象作为成员对象,创建动态对象时需调用A的构造的构造函数,输出函数,输出A;之后调用类;之后调用类B的构造函数,输出的构造函数,输出B;释放动态对象时,析构函数;释放动态对象时,析构函数的调用顺序恰好相反,先调用的调用顺序恰好相反,先调用B的析构函数,再调用的析构函数,再调用A的析构函数。的析构函数。答案:答案:ABBA 101实用精品课件PPT三、编程题三、编程题 1编程实现:有一个汽车类编程实现:有一个汽车类Vehicle,它具有一个需传递参数的构造函数,还,它

137、具有一个需传递参数的构造函数,还拥有保护数据成员车轮个数拥有保护数据成员车轮个数wheels和车重和车重weight。小汽车类。小汽车类Car是是Vehicle的的私有派生类,其中包含载人数私有派生类,其中包含载人数passengerLoad。卡车类。卡车类Truck是是Vehicle的私的私有派生类,其中包含载人数有派生类,其中包含载人数passengerLoad和载重量和载重量payload。每个类都有相。每个类都有相关数据的输出函数关数据的输出函数Show()。 参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使

138、用命名空间std / 声明汽车类声明汽车类class Vehicleprotected:/ 保护成员保护成员int wheel;/ 车轮个数车轮个数double weight;/ 车重车重public:/ 公有函数公有函数Vehicle(int wh = 4, double wt = 1000): wheel(wh), weight(wt) void Show() const/ 输出相关信息输出相关信息 cout 车轮个数车轮个数: wheel endl; cout 车重车重: weight 公斤公斤 endl; ;102实用精品课件PPT1编程实现:有一个汽车类编程实现:有一个汽车类Vehi

139、cle,它具有一个需传递参数的构造函数,还,它具有一个需传递参数的构造函数,还拥有保护数据成员车轮个数拥有保护数据成员车轮个数wheels和车重和车重weight。小汽车类。小汽车类Car是是Vehicle的的私有派生类,其中包含载人数私有派生类,其中包含载人数passengerLoad。卡车类。卡车类Truck是是Vehicle的私的私有派生类,其中包含载人数有派生类,其中包含载人数passengerLoad和载重量和载重量payload。每个类都有相。每个类都有相关数据的输出函数关数据的输出函数Show()。 / 声明小汽车类声明小汽车类class Car: private Vehicle

140、private:/ 私有成员私有成员int passengerLoad;/ 载人数载人数public:/ 公有函数公有函数Car(int wh = 4, double wt = 1000, int p = 5): Vehicle(wh, wt), passengerLoad(p) / 构造函数构造函数void Show() const/ 输出相关信息输出相关信息 Vehicle:Show();/ 调用基类的调用基类的Show()cout 载人数载人数: passengerLoad endl; ;103实用精品课件PPT1编程实现:有一个汽车类编程实现:有一个汽车类Vehicle,它具有一个需传

141、递参数的构造函数,还,它具有一个需传递参数的构造函数,还拥有保护数据成员车轮个数拥有保护数据成员车轮个数wheels和车重和车重weight。小汽车类。小汽车类Car是是Vehicle的的私有派生类,其中包含载人数私有派生类,其中包含载人数passengerLoad。卡车类。卡车类Truck是是Vehicle的私的私有派生类,其中包含载人数有派生类,其中包含载人数passengerLoad和载重量和载重量payload。每个类都有相。每个类都有相关数据的输出函数关数据的输出函数Show()。 / 声明卡车类声明卡车类class Truck: private Vehicleprivate:/ 私

142、有成员私有成员int passengerLoad;/ 载人数载人数double payload;/ 载重量载重量public:/ 公有函数公有函数Truck(int wh = 4, double wt = 1000, int p = 5, double pay = 2000):Vehicle(wh, wt), passengerLoad(p), payload(pay) void Show() const/ 输出相关信息输出相关信息 Vehicle:Show();/ 调用基类的调用基类的Show()cout 载人数载人数: passengerLoad endl; cout 载重量载重量: pa

143、yload 公斤公斤 endl; ;104实用精品课件PPT1编程实现:有一个汽车类编程实现:有一个汽车类Vehicle,它具有一个需传递参数的构造函数,还,它具有一个需传递参数的构造函数,还拥有保护数据成员车轮个数拥有保护数据成员车轮个数wheels和车重和车重weight。小汽车类。小汽车类Car是是Vehicle的的私有派生类,其中包含载人数私有派生类,其中包含载人数passengerLoad。卡车类。卡车类Truck是是Vehicle的私的私有派生类,其中包含载人数有派生类,其中包含载人数passengerLoad和载重量和载重量payload。每个类都有相。每个类都有相关数据的输出函

144、数关数据的输出函数Show()。 int main()/ 主函数主函数main()Vehicle v;/ 定义对象定义对象cout 汽车信息汽车信息: endl;/ 输出提示输出提示v.Show();/ 输出信息输出信息Car c;/ 定义对象定义对象cout endl 小汽车信息小汽车信息: endl;/ 输出提示输出提示c.Show();/ 输出信息输出信息Truck t;/ 定义对象定义对象cout endl 卡车车信息卡车车信息: endl;/ 输出提示输出提示t.Show();/ 输出信息输出信息system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示信息

145、,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统105实用精品课件PPT*2一个出版公司,同时销售书籍和磁带。创建一个一个出版公司,同时销售书籍和磁带。创建一个Publication类存储出版类存储出版物的标题物的标题title(字符串类型)和价格(字符串类型)和价格price(float类型)。从这个类派生出两个类型)。从这个类派生出两个类:一个是类:一个是Book类,含有表示页数类,含有表示页数page(int类型)的数据成员;另一个是类型)的数据成员;另一个是Tape类,含有一个数据成员表示以分钟为单位的播放时间类,含有一个数据成员表示以分钟为单位的播放

146、时间playTime(float类类型)。这型)。这3个类都有一个可以通过键盘获得数据的函数个类都有一个可以通过键盘获得数据的函数GetData( ),和一个显,和一个显示数据的函数示数据的函数Show()。编写一个。编写一个main( )程序,通过创建程序,通过创建Book类和类和Tape类的类的对象来测试这两些类,然后调用对象来测试这两些类,然后调用GetData( )向其中加入数据,并调用向其中加入数据,并调用Show()显显示这些数据。示这些数据。 参考程序:参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间

147、std / 声明出版物类声明出版物类class Publicationprotected:/ 保护成员保护成员char title20;/ 标题标题float price;/ 价格价格106实用精品课件PPT*2一个出版公司,同时销售书籍和磁带。创建一个一个出版公司,同时销售书籍和磁带。创建一个Publication类存储出版类存储出版物的标题物的标题title(字符串类型)和价格(字符串类型)和价格price(float类型)。从这个类派生出两个类型)。从这个类派生出两个类:一个是类:一个是Book类,含有表示页数类,含有表示页数page(int类型)的数据成员;另一个是类型)的数据成员;另

148、一个是Tape类,含有一个数据成员表示以分钟为单位的播放时间类,含有一个数据成员表示以分钟为单位的播放时间playTime(float类类型)。这型)。这3个类都有一个可以通过键盘获得数据的函数个类都有一个可以通过键盘获得数据的函数GetData( ),和一个显,和一个显示数据的函数示数据的函数Show()。编写一个。编写一个main( )程序,通过创建程序,通过创建Book类和类和Tape类的类的对象来测试这两些类,然后调用对象来测试这两些类,然后调用GetData( )向其中加入数据,并调用向其中加入数据,并调用Show()显显示这些数据。示这些数据。 参考程序:参考程序:public:/

149、 公有函数公有函数Publication(char t = , float p = 0): price(p) strcpy(title, t); void GetData()/ 输入相关信息输入相关信息cout title;/ 输入标题输入标题cout price;/ 输入价格输入价格void Show() const/ 输出相关信息输出相关信息 cout 标题标题: title endl; cout 价格价格: price 元元 endl; ;107实用精品课件PPT*2一个出版公司,同时销售书籍和磁带。创建一个一个出版公司,同时销售书籍和磁带。创建一个Publication类存储出版物的标

150、题类存储出版物的标题title(字符串类型)和价格(字符串类型)和价格price(float类型)。从这个类派生出两个类:一个是类型)。从这个类派生出两个类:一个是Book类,含有表示页数类,含有表示页数page(int类型)的数据成员;另一个是类型)的数据成员;另一个是Tape类,含有一个数据成员类,含有一个数据成员表示以分钟为单位的播放时间表示以分钟为单位的播放时间playTime(float类型)。这类型)。这3个类都有一个可以通过键盘个类都有一个可以通过键盘获得数据的函数获得数据的函数GetData( ),和一个显示数据的函数,和一个显示数据的函数Show()。编写一个。编写一个mai

151、n( )程序,程序,通过创建通过创建Book类和类和Tape类的对象来测试这两些类,然后调用类的对象来测试这两些类,然后调用GetData( )向其中加入数向其中加入数据,并调用据,并调用Show()显示这些数据。显示这些数据。 / 声明书籍类声明书籍类class Book: public Publication private:/ 私有成员私有成员int page;/ 页数页数public:/ 公有函数公有函数Book(char t = , float p = 0, int pg = 0): Publication(t, p), page(pg) void GetData()/ 输入相关信息

152、输入相关信息Publication:GetData();/ 调用基类的调用基类的GetData()cout page;/ 输入页数输入页数void Show() const/ 输出相关信息输出相关信息 Publication:Show();/ 调用基类的调用基类的Show()cout 页数页数: page endl; ;108实用精品课件PPT*2一个出版公司,同时销售书籍和磁带。创建一个一个出版公司,同时销售书籍和磁带。创建一个Publication类存储出版物的标题类存储出版物的标题title(字符串类型)和价格(字符串类型)和价格price(float类型)。从这个类派生出两个类:一个是

153、类型)。从这个类派生出两个类:一个是Book类,含有表示页数类,含有表示页数page(int类型)的数据成员;另一个是类型)的数据成员;另一个是Tape类,含有一个数据成员类,含有一个数据成员表示以分钟为单位的播放时间表示以分钟为单位的播放时间playTime(float类型)。这类型)。这3个类都有一个可以通过键盘个类都有一个可以通过键盘获得数据的函数获得数据的函数GetData( ),和一个显示数据的函数,和一个显示数据的函数Show()。编写一个。编写一个main( )程序,通程序,通过创建过创建Book类和类和Tape类的对象来测试这两些类,然后调用类的对象来测试这两些类,然后调用Ge

154、tData( )向其中加入数据,向其中加入数据,并调用并调用Show()显示这些数据。显示这些数据。 / 声明磁带类声明磁带类class Tape: public Publicationprivate:/ 私有成员私有成员float playTime;/ 播放时间播放时间public:/ 公有函数公有函数Tape(char t = , float p = 0, float pt = 0): Publication(t,p),playTime(pt) void GetData()/ 输入相关信息输入相关信息Publication:GetData();/ 调用基类的调用基类的GetData()co

155、ut playTime;/ 输入播放时间输入播放时间void Show() const/ 输出相关信息输出相关信息 Publication:Show();/ 调用基类的调用基类的Show()cout 播放时间播放时间: playTime 分钟分钟 endl; ;109实用精品课件PPT*2一个出版公司,同时销售书籍和磁带。创建一个一个出版公司,同时销售书籍和磁带。创建一个Publication类存储出版物的标题类存储出版物的标题title(字符串类型)和价格(字符串类型)和价格price(float类型)。从这个类派生出两个类:一个是类型)。从这个类派生出两个类:一个是Book类,含有表示页数

156、类,含有表示页数page(int类型)的数据成员;另一个是类型)的数据成员;另一个是Tape类,含有一个数据成员类,含有一个数据成员表示以分钟为单位的播放时间表示以分钟为单位的播放时间playTime(float类型)。这类型)。这3个类都有一个可以通过键盘个类都有一个可以通过键盘获得数据的函数获得数据的函数GetData( ),和一个显示数据的函数,和一个显示数据的函数Show()。编写一个。编写一个main( )程序,程序,通过创建通过创建Book类和类和Tape类的对象来测试这两些类,然后调用类的对象来测试这两些类,然后调用GetData( )向其中加入数向其中加入数据,并调用据,并调用

157、Show()显示这些数据。显示这些数据。 int main()/ 主函数主函数main()Publication p;/ 定义对象定义对象cout 输入出版物信息输入出版物信息: endl;/ 输入提示输入提示p.GetData();/ 输入相关信息输入相关信息cout 出版物信息出版物信息: endl;/ 输入提示输入提示p.Show();/ 输出相关信息输出相关信息Book b;/ 定义对象定义对象cout endl 输入书籍信息输入书籍信息: endl;/ 输入提示输入提示b.GetData();/ 输入相关信息输入相关信息cout 书籍信息书籍信息: endl;/ 输入提示输入提示b.

158、Show();/ 输出相关信息输出相关信息Tape t;/ 定义对象定义对象cout endl 输入磁带信息输入磁带信息: endl;/ 输入提示输入提示t.GetData();/ 输入相关信息输入相关信息cout 磁带信息磁带信息: endl;/ 输入提示输入提示t.Show();/ 输出相关信息输出相关信息system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统110实用精品课件PPT*3定义定义Employee(员工)类,由(员工)类,由Employee分别派生出分别派生出S

159、aleman(销售员)(销售员)类和类和Manager(经理)类,再由(经理)类,再由Saleman(销售员)类和(销售员)类和Manager(经理)(经理)类采用多重继承方式派生出新类类采用多重继承方式派生出新类SaleManager(销售经理)类,各类之间的继(销售经理)类,各类之间的继承关系如图承关系如图5.7所示。所示。图图5.7 各类之间的继承关系各类之间的继承关系要求:要求:(1)在)在Employee类中包含的数据成员有编号类中包含的数据成员有编号(num)、姓名)、姓名(name)、基本工、基本工资资(basicSalary)和奖金和奖金(prize)。在。在Saleman类中

160、还包含数据成员销售员提成类中还包含数据成员销售员提成比例比例(deductRate)和个人销售额和个人销售额(personAmount),在,在Manager类中还包含数类中还包含数据成员经理提成比例据成员经理提成比例(totalDeductRate)和总销售额和总销售额(totalAmount)。在。在SaleManager类中不包含其它数据成员。类中不包含其它数据成员。(2)各类人员的实发工资公式如下:)各类人员的实发工资公式如下:员工实发工资员工实发工资=基本工资基本工资+奖金奖金销售员实发工资销售员实发工资=基本工资基本工资+奖金奖金+个人销售额个人销售额*销售员提成比例销售员提成比例

161、经理实发工资经理实发工资=基本工资基本工资+奖金奖金+总销售额总销售额*经理提成比例经理提成比例销售经理实发工资销售经理实发工资=基本工资基本工资+奖金奖金+个人销售额个人销售额*销售员提成比例销售员提成比例+总销售额总销售额*经经理提成比例理提成比例(3)每个类都有构造函数、输出基本信息)每个类都有构造函数、输出基本信息(Show)函数和输出实发工资函数和输出实发工资(ShowSalary)函数。函数。111实用精品课件PPT参考程序:参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std / 声明员工类声明员工

162、类class Employeeprotected:/ 保护成员保护成员int num;/ 编号编号char name16;/ 姓名姓名float basicSalary;/ 基本工资基本工资float prize;/ 奖金奖金public:/ 公有函数公有函数Employee(int n, char nm, float bs, float p):/ 构造函数构造函数 num(n), basicSalary(bs), prize(p) strcpy(name, nm); void Show() const/ 输出基本信息输出基本信息 cout 编号编号: num endl; cout 姓名姓名:

163、 name endl; cout 基本工资基本工资: basicSalary 元元 endl; cout 奖金奖金: prize 元元 endl; void ShowSalary() const / 输出实发工资输出实发工资 cout 实发工资实发工资: basicSalary + prize 元元 endl; ;112实用精品课件PPT/ 声明销售员类声明销售员类class Saleman: virtual public Employeeprotected:/ 保护成员保护成员float deductRate;/ 销售员提成比例销售员提成比例float personAmount;/ 个人销售

164、额个人销售额public:/ 公有函数公有函数Saleman(int n, char nm, float bs, float p, float d, float pa): Employee(n,nm,bs,p),deductRate(d),personAmount(pa)void Show() const/ 输出基本信息输出基本信息 Employee:Show();/ 调用基类的调用基类的Show() cout 销售员提成比例销售员提成比例: deductRate endl; cout 个人销售额个人销售额: personAmount 元元 endl; void ShowSalary() co

165、nst/ 输出实发工资输出实发工资 cout 实发工资实发工资: basicSalary + prize + deductRate * personAmount 元元 endl; ;113实用精品课件PPT/ 声明经理类声明经理类class Manager: virtual public Employeeprotected:/ 保护成员保护成员float totalDeductRate;/ 经理提成比例经理提成比例float totalAmount;/ 总销售额总销售额public:/ 公有函数公有函数Manager(int n, char nm, float bs, float p, flo

166、at td, float ta): Employee(n,nm,bs,p),totalDeductRate(td),totalAmount(ta)void Show() const/ 输出基本信息输出基本信息 Employee:Show();/ 调用基类的调用基类的Show() cout 经理提成比例经理提成比例: totalDeductRate endl; cout 总销售额总销售额: totalAmount 元元 endl; void ShowSalary() const/ 输出实发工资输出实发工资 cout 实发工资实发工资: basicSalary + prize + totalDed

167、uctRate * totalAmount 元元 endl; ;114实用精品课件PPT/ 声明销售经理类声明销售经理类class SaleManager: public Saleman, public Managerpublic:/ 公有函数公有函数SaleManager(int n, char nm, float bs, float p, float d, float pa, float td, float ta):/ 构造函数构造函数 Employee(n, nm, bs, p), Saleman(n, nm, bs, p, d, pa), Manager(n, nm, bs, p, t

168、d, ta) void Show() const/ 输出基本信息输出基本信息 Employee:Show();/ 调用基类的调用基类的Show() cout 销售员提成比例销售员提成比例: deductRate endl; cout 个人销售额个人销售额: personAmount 元元 endl; cout 经理提成比例经理提成比例: totalDeductRate endl; cout 总销售额总销售额: totalAmount 元元 endl; void ShowSalary() const/ 输出实发工资输出实发工资 cout 实发工资实发工资: basicSalary + prize

169、 + deductRate * personAmount + totalDeductRate * totalAmount 元元 endl; ;115实用精品课件PPTint main()/ 主函数主函数main()Employee e(106, 李明李明, 1680, 1080); / 定义对象定义对象cout 员工信息员工信息: endl;/ 输出提示输出提示e.Show();/ 输出基本信息输出基本信息e.ShowSalary();/ 输出实发工资输出实发工资Saleman s(108, 李杰明李杰明, 2680, 1680, 0.15, 23000);/ 定义对象定义对象cout end

170、l 销售员信息销售员信息: endl;/ 输出提示输出提示s.Show();/ 输出基本信息输出基本信息s.ShowSalary();/ 输出实发工资输出实发工资Manager m(116, 吴倩吴倩, 3680, 2680, 0.1, 83000);/ 定义对象定义对象cout endl 经理信息经理信息: endl;/ 输出提示输出提示m.Show();/ 输出基本信息输出基本信息m.ShowSalary();/ 输出实发工资输出实发工资SaleManager sm(118, 吴杰吴杰, 3680, 2680, 0.15, 28000, 0.1, 88000);cout endl 销售经理

171、信息销售经理信息: endl;/ 输出提示输出提示sm.Show();/ 输出基本信息输出基本信息sm.ShowSalary();/ 输出实发工资输出实发工资system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统116实用精品课件PPTC+C+面向对象程序设计教程面向对象程序设计教程第第6 6章章 多态性多态性习题解答习题解答 117实用精品课件PPT一、选择题一、选择题 1.在在C+中,用于实现运行时多态性的是中,用于实现运行时多态性的是 。A)友元函数)友元函数B)重载函数)

172、重载函数C)模板函数)模板函数D)虚函数)虚函数 解析:解析:C+支持两种多态性:编译时的多态性和运行时的多态性。其中,支持两种多态性:编译时的多态性和运行时的多态性。其中,用于实现编译时多态性的是函数重载,用于实现运行时多态性的是虚函数。用于实现编译时多态性的是函数重载,用于实现运行时多态性的是虚函数。答案:答案:D 118实用精品课件PPT2虚函数支持多态调用,一个基类的指针可以指向派生类的对象,而且通过这虚函数支持多态调用,一个基类的指针可以指向派生类的对象,而且通过这样的指针调用虚函数时,被调用的是指针所指的实际对象的虚函数;而非虚函数样的指针调用虚函数时,被调用的是指针所指的实际对象

173、的虚函数;而非虚函数不支持多态调用。有以下程序:不支持多态调用。有以下程序:class Apublic:virtual void Fun() const cout A; / 输出信息输出信息void Show() const cout A; / 输出信息输出信息;class B: public Apublic:void Fun() const cout B; / 输出信息输出信息void Show() const cout Fun();/ 调用调用Fun()p-Show();/ 输出信息输出信息cout endl;/ 换行换行return 0; / 返回值返回值0, 返回操作系统返回操作系统程

174、序运行的输出结果是程序运行的输出结果是 。A)BAB)ABC)AAD)BB 解析:解析:基类的指针基类的指针p指向派生类的对象指向派生类的对象obj,通过基类指针,通过基类指针p调用虚函数调用虚函数Fun()时,时,被调用的是指针所指的实际对象被调用的是指针所指的实际对象obj的虚函数版本,故输出的虚函数版本,故输出“B”;但通过基类指;但通过基类指针针p调用实函数调用实函数Show()时,调用的是基类的函数版本,故输出时,调用的是基类的函数版本,故输出“A”。答案:答案:A 119实用精品课件PPT3有以下程序:有以下程序:class Bpublic:virtual void Show()

175、const cout B; / 输出信息输出信息;class D: public Bpublic:void Show() const cout Show(); / 定义定义Fun1()void Fun2(const B &obj) obj.Show(); / 定义定义Fun2()void Fun3(const B obj) obj.Show(); / 定义定义Fun3()int main()/ 主函数主函数main()B *p = new D;/ 指针指针D d;/ 对象对象Fun1(p);/ 调用调用Fun1()Fun2(d);/ 调用调用Fun2()Fun3(d);/ 调用调用Fun3()

176、cout endl;/ 换行换行return 0; / 返回值返回值0, 返回操作系统返回操作系统程序的输出结果是程序的输出结果是 。A)BBB B)BBD C)DBB D)DDB 解析:解析:执行函数执行函数Funl()的过程中,通过基类的过程中,通过基类B的指针的指针P调用虚函数调用虚函数Show()时,被调用时,被调用的是指针所指的实际对象(这里是派生类的是指针所指的实际对象(这里是派生类D的对象)的虚函数版本,故输出的对象)的虚函数版本,故输出“D”;执;执行函数行函数Fun2()的过程中,通过基类的过程中,通过基类B的引用调用虚函数的引用调用虚函数Show()时,被调用的是所引用时,

177、被调用的是所引用的实际对象(这里是派生类的实际对象(这里是派生类D的对象的对象)的虚函数版本,故输出的虚函数版本,故输出“D”;执行函数;执行函数Fun3()的的过程中,通过派生类对象过程中,通过派生类对象d调用的是基类的调用的是基类的Show()函数版本,输出函数版本,输出“B”。答案:答案:D 120实用精品课件PPT4下面下面4个关键字中,用于说明虚函数的是个关键字中,用于说明虚函数的是 。A)virtual B)public C)protected D)private 解析:解析:用用virtual声明一个成员函数为虚函数。声明一个成员函数为虚函数。答案:答案:A 121实用精品课件P

178、PT二、填空题二、填空题 1有以下程序:有以下程序:class Apublic:virtual void Fun() const cout A endl; / 输出信息输出信息;class B: public Apublic:void Fun() const cout B endl; / 输出信息输出信息;void Show(const A &a) a.Fun(); / 引用参数引用参数int main()/ 主函数主函数main()B obj;/ 定义对象定义对象Show(obj);/ 输出信息输出信息system(PAUSE); / 调用库函数调用库函数system( ),输出系统提示,输

179、出系统提示return 0; / 返回值返回值0, 返回操作系统返回操作系统执行这个程序的输出结果是执行这个程序的输出结果是 。 解析:解析:一个基类指针(或引用)可以用于指向它的派生类对象。通过基类指针(或一个基类指针(或引用)可以用于指向它的派生类对象。通过基类指针(或引用)调用虚函数引用)调用虚函数Fun()时,被调用的是派生类的那个函数版本,所以输出时,被调用的是派生类的那个函数版本,所以输出“B”并并换行。换行。答案:答案:B 122实用精品课件PPT2下列程序的输出结果为下列程序的输出结果为2,试将程序补充完整。,试将程序补充完整。class Apublic: void Show(

180、) const cout 1 endl; / 输出信息输出信息;class B: public Apublic:void Show() const cout 2 Show();/ 输出信息输出信息delete p;/ 释放空间释放空间system(PAUSE); / 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值0, 返回操作系统返回操作系统 解析:解析:当基类指针指向派生类对象时,用基类指针调用实函数时调用的是基类当基类指针指向派生类对象时,用基类指针调用实函数时调用的是基类的函数版本,调用虚函数时调用的是派生类的函数版本。程序翰出的函

181、数版本,调用虚函数时调用的是派生类的函数版本。程序翰出“2”,所,所以调用的是虚函数,横线处应填声明虚函数的关键字以调用的是虚函数,横线处应填声明虚函数的关键字virtual。答案:答案:virtual 123实用精品课件PPT3有以下程序:有以下程序:class Apublic:virtual void Show() const cout 1; / 输出信息输出信息;class B: public A ;class C: public Bpublic:void Show() const/ 输出信息输出信息 B:Show();/ 调用类调用类B的的Show()函数函数cout 2 Show()

182、;/ 输出信息输出信息delete p;/ 释放空间释放空间 system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值0, 返回操作系统返回操作系统执行上面的程序,输出结果是执行上面的程序,输出结果是 。 解析:解析:执行语句执行语句“p-Show();”时,由于时,由于p指向派生类指向派生类C的对象,而的对象,而Show()为虚函数,为虚函数,这样执行的是派生类这样执行的是派生类C的的Show()函数的版本,先执行函数的版本,先执行“B:Show();”输出输出“1”。然后。然后输出输出“2”。答案:答案:12 1

183、24实用精品课件PPT4含有纯虚函数的类称为含有纯虚函数的类称为 。 解析:解析:当基类无法确定(或无法完全确定)一个虚函数的具体操作方式或内容,当基类无法确定(或无法完全确定)一个虚函数的具体操作方式或内容,只能靠派生类来提供该虚函数的具体的实现版本时,这种虚函数称为纯虚函数,只能靠派生类来提供该虚函数的具体的实现版本时,这种虚函数称为纯虚函数,该基类称为抽象类。该基类称为抽象类。答案:答案:抽象类抽象类 125实用精品课件PPT三、编程题三、编程题 1设计一个基类设计一个基类Shape包含成员函数包含成员函数Show(),将,将Show()声明为纯虚函数。声明为纯虚函数。Shape类公有派

184、生矩形类类公有派生矩形类Rectangle和圆类和圆类Circle,分别定义,分别定义Show()实现其主实现其主要几何元素的显示。使用抽象类要几何元素的显示。使用抽象类Shape类型的指针,当它指向某个派生类的对类型的指针,当它指向某个派生类的对象时,就可以通过它访问该对象的虚成员函数象时,就可以通过它访问该对象的虚成员函数Show()。 参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std const double PI = 3.1415926;/ 常量常量PI/ 声明形状抽象类声明形状抽象类clas

185、s Shapepublic:/ 公有成员公有成员:virtual Shape() / 虚析构函数虚析构函数virtual void Show() const = 0; / 纯虚函数纯虚函数, 显示主要几何元素显示主要几何元素;126实用精品课件PPT1设计一个基类设计一个基类Shape包含成员函数包含成员函数Show(),将,将Show()声明为纯虚函数。声明为纯虚函数。Shape类公有派生矩形类类公有派生矩形类Rectangle和圆类和圆类Circle,分别定义,分别定义Show()实现其主实现其主要几何元素的显示。使用抽象类要几何元素的显示。使用抽象类Shape类型的指针,当它指向某个派生

186、类的对类型的指针,当它指向某个派生类的对象时,就可以通过它访问该对象的虚成员函数象时,就可以通过它访问该对象的虚成员函数Show()。 / 声明矩形类声明矩形类class Rectangle: public Shapeprivate:/ 数据成员数据成员:double height;/ 高高double width;/ 宽宽public:/ 公有函数公有函数:Rectangle(double h, double w): height(h), width(w) / 构造函数构造函数void Show() const/ 显示主要几何元素显示主要几何元素cout 矩形矩形: endl;cout 高高

187、: height endl;cout 宽宽: width endl;cout 周长周长: 2 * (height + width) endl;cout 面积面积: height * width endl endl;127实用精品课件PPT1设计一个基类设计一个基类Shape包含成员函数包含成员函数Show(),将,将Show()声明为纯虚函数。声明为纯虚函数。Shape类公有派生矩形类类公有派生矩形类Rectangle和圆类和圆类Circle,分别定义,分别定义Show()实现其主实现其主要几何元素的显示。使用抽象类要几何元素的显示。使用抽象类Shape类型的指针,当它指向某个派生类的对类型的

188、指针,当它指向某个派生类的对象时,就可以通过它访问该对象的虚成员函数象时,就可以通过它访问该对象的虚成员函数Show()。 / 声明圆形类声明圆形类class Circle: public Shapeprivate:/ 数据成员数据成员:double radius;/ 半径半径public:/ 公有函数公有函数:Circle(double r): radius(r) / 构造函数构造函数void Show() const/ 显示主要几何元素显示主要几何元素cout 圆形圆形: endl;cout 半径半径: radius endl;cout 周长周长: 2 * PI * radius endl

189、;cout 面积面积: PI * radius * radius endl Show();/ 显示主要几何元素显示主要几何元素delete p;/ 释放临时对象释放临时对象p = new Rectangle(1, 2);/ p指向矩形对象指向矩形对象p-Show();/ 显示主要几何元素显示主要几何元素delete p;/ 释放临时对象释放临时对象system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值, 返回操作系统返回操作系统129实用精品课件PPT*2编写程序,定义抽象基类编写程序,定义抽象基类Shape(形状

190、形状),由它派生出,由它派生出2个派生类个派生类: Circle(圆形圆形)和和Square (正方形正方形),用函数,用函数ShowArea()分别显示各种图形的面积,最分别显示各种图形的面积,最后还要显示所有图形的总面积。要求用基类指针数组,数组的每个元素指向一后还要显示所有图形的总面积。要求用基类指针数组,数组的每个元素指向一个派生类对象。个派生类对象。 参考程序:参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std const double PI = 3.1415926; / 常量常量PIconst in

191、t NUM = 2;/ 常量常量NUM/ 声明形状抽象类声明形状抽象类class Shapepublic:/ 公有成员公有成员:virtual Shape() / 虚析构函数虚析构函数virtual void ShowArea() const = 0;/ 纯虚函数纯虚函数, 显示面积显示面积;130实用精品课件PPT*2编写程序,定义抽象基类编写程序,定义抽象基类Shape(形状形状),由它派生出,由它派生出2个派生类个派生类: Circle(圆形圆形)和和Square (正方形正方形),用函数,用函数ShowArea()分别显示各种图形的面积,最分别显示各种图形的面积,最后还要显示所有图形的

192、总面积。要求用基类指针数组,数组的每个元素指向一后还要显示所有图形的总面积。要求用基类指针数组,数组的每个元素指向一个派生类对象。个派生类对象。 / 声明矩形类声明矩形类class Rectangle: public Shapeprivate:/ 数据成员数据成员:double height;/ 高高double width;/ 宽宽public:/ 公有函数公有函数:Rectangle(double h, double w): height(h), width(w) / 构造函数构造函数void ShowArea() const/ 显示面积显示面积cout 矩形面积矩形面积: height

193、* width endl;131实用精品课件PPT*2编写程序,定义抽象基类编写程序,定义抽象基类Shape(形状形状),由它派生出,由它派生出2个派生类个派生类: Circle(圆形圆形)和和Square (正方形正方形),用函数,用函数ShowArea()分别显示各种图形的面积,最分别显示各种图形的面积,最后还要显示所有图形的总面积。要求用基类指针数组,数组的每个元素指向一后还要显示所有图形的总面积。要求用基类指针数组,数组的每个元素指向一个派生类对象。个派生类对象。 / 声明圆形类声明圆形类class Circle: public Shapeprivate:/ 数据成员数据成员:doub

194、le radius;/ 半径半径public:/ 公有函数公有函数:Circle(double r): radius(r) / 构造函数构造函数void ShowArea() const/ 显示面积显示面积cout 圆面积圆面积: PI * radius * radius endl;132实用精品课件PPTint main()/ 主函数主函数main()Shape *aNUM;/ 抽象基类抽象基类Shape指针数组指针数组int i, select;/ 定义整型变量定义整型变量for (i = 0; i NUM; i+)/ 依次产生各个图形依次产生各个图形cout select;/ 输入选择输

195、入选择while (select 2)cout select;/ 输入选择输入选择if (select = 1)double h;/ 高高double w;/ 宽宽cout h;/ 输入高输入高cout w;/ 输入宽输入宽ai = new Rectangle(h, w);/ ai指向矩形对象指向矩形对象elsedouble r;/ 半径半径cout r;/ 输入半径输入半径ai = new Circle(r);/ ai指向圆对象指向圆对象133实用精品课件PPT*2编写程序,定义抽象基类编写程序,定义抽象基类Shape(形状形状),由它派生出,由它派生出2个派生类个派生类: Circle(圆

196、形圆形)和和Square (正方形正方形),用函数,用函数ShowArea()分别显示各种图形的面积,最分别显示各种图形的面积,最后还要显示所有图形的总面积。要求用基类指针数组,数组的每个元素指向一后还要显示所有图形的总面积。要求用基类指针数组,数组的每个元素指向一个派生类对象。个派生类对象。 for (i = 0; i ShowArea();/ 显示面积显示面积delete ai;/ 释放临时对象释放临时对象system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值, 返回操作系统返回操作系统134实用精品课件PPT

197、*3定义定义Employee(员工)类,由(员工)类,由Employee分别派生出分别派生出Saleman(销售员)(销售员)类和类和Manager(经理)类。(经理)类。要求:要求:(1)在)在Employee类中包含的数据成员有编号类中包含的数据成员有编号(num)、姓名)、姓名(name)、基本工、基本工资资(basicSalary)和奖金和奖金(prize)。在。在Saleman类中还包含数据成员销售员提成比类中还包含数据成员销售员提成比例例(deductRate)和个人销售额和个人销售额(personAmount),在,在Manager类中还包含数据类中还包含数据成员经理提成比例成员

198、经理提成比例(totalDeductRate)和总销售额和总销售额(totalAmount)。(2)各类人员的实发工资公式如下:)各类人员的实发工资公式如下:员工实发工资员工实发工资=基本工资基本工资+奖金奖金销售员实发工资销售员实发工资=基本工资基本工资+奖金奖金+个人销售额个人销售额*销售员提成比例销售员提成比例经理实发工资经理实发工资=基本工资基本工资+奖金奖金+总销售额总销售额*经理提成比例经理提成比例(3)每个类都有构造函数、输出基本信息虚函数)每个类都有构造函数、输出基本信息虚函数Show()和输出实发工资和输出实发工资(ShowSalary) 虚函数虚函数ShowSalary()

199、。参考程序:参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std 135实用精品课件PPT/ 声明员工类声明员工类class Employeeprotected:/ 保护成员保护成员int num;/ 编号编号char name16;/ 姓名姓名float basicSalary;/ 基本工资基本工资float prize;/ 奖金奖金public:/ 公有函数公有函数virtual Employee() / 析构函数析构函数Employee(int n, char nm, float bs, float p):

200、/ 构造函数构造函数 num(n), basicSalary(bs), prize(p) strcpy(name, nm); virtual void Show() const/ 输出基本信息输出基本信息 cout 编号编号: num endl; cout 姓名姓名: name endl; cout 基本工资基本工资: basicSalary 元元 endl; cout 奖金奖金: prize 元元 endl; virtual void ShowSalary() const/ 输出实发工资输出实发工资 cout 实发工资实发工资: basicSalary + prize 元元 endl; ;1

201、36实用精品课件PPT/ 声明销售员类声明销售员类class Saleman: public Employeeprotected:/ 保护成员保护成员float deductRate;/ 销售员提成比例销售员提成比例float personAmount;/ 个人销售额个人销售额public:/ 公有函数公有函数Saleman(int n, char nm, float bs, float p, float d, float pa): Employee(n,nm,bs,p),deductRate(d),personAmount(pa)void Show() const/ 输出基本信息输出基本信息

202、 Employee:Show();/ 调用基类的调用基类的Show() cout 销售员提成比例销售员提成比例: deductRate endl; cout 个人销售额个人销售额: personAmount 元元 endl; void ShowSalary() const/ 输出实发工资输出实发工资 cout 实发工资实发工资: basicSalary + prize+deductRate*personAmount元元endl; ;137实用精品课件PPT/ 声明经理类声明经理类class Manager: public Employeeprotected:/ 保护成员保护成员float to

203、talDeductRate;/ 经理提成比例经理提成比例float totalAmount;/ 总销售额总销售额public:/ 公有函数公有函数Manager(int n, char nm, float bs, float p, float td, float ta): Employee(n,nm,bs,p),totalDeductRate(td),totalAmount(ta) void Show() const/ 输出基本信息输出基本信息 Employee:Show();/ 调用基类的调用基类的Show() cout 经理提成比例经理提成比例: totalDeductRate endl;

204、 cout 总销售额总销售额: totalAmount 元元 endl; void ShowSalary() const/ 输出实发工资输出实发工资 cout 实发工资实发工资: basicSalary + prize + totalDeductRate * totalAmount 元元 endl; ;138实用精品课件PPTint main()/ 主函数主函数main()Employee *p;/ 定义基类定义基类Employee指针指针p = new Employee(106, 李明李明, 1680, 1080);/ p指向矩形对象指向矩形对象cout 员工信息员工信息: Show();/

205、 输出基本信息输出基本信息p-ShowSalary();/ 输出实发工资输出实发工资delete p;/ 释放临时对象释放临时对象p = new Saleman(108, 李杰明李杰明, 2680, 1680, 0.15, 23000);cout endl 销售员信息销售员信息: Show();/ 输出基本信息输出基本信息p-ShowSalary();/ 输出实发工资输出实发工资delete p;/ 释放临时对象释放临时对象p = new Manager(116, 吴倩吴倩, 3680, 2680, 0.1, 83000);cout endl 经理信息经理信息: Show();/ 输出基本信息

206、输出基本信息p-ShowSalary();/ 输出实发工资输出实发工资delete p;/ 释放临时对象释放临时对象system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统139实用精品课件PPTC+C+面向对象程序设计教程面向对象程序设计教程第第7 7章章 输入输出流输入输出流习题解答习题解答 140实用精品课件PPT一、选择题一、选择题 1对于语句对于语句“cout endl x;”中的各个组成部分,下列叙述中错误的中的各个组成部分,下列叙述中错误的是是 。A)“cout”是一

207、个输出流对象是一个输出流对象B)“endl”的作用是输出回车换行的作用是输出回车换行C)“x”是一个变量是一个变量D)“”称为输入运算符称为输入运算符解析:解析:由于左移运算符由于左移运算符“”重载用于通过输出流输出表达式的值,所以重载用于通过输出流输出表达式的值,所以称为输出运算符。故选项称为输出运算符。故选项D错误。错误。答案:答案:D 141实用精品课件PPT2有以下程序:有以下程序:int main()/ 主函数主函数main()cout.fill(*);/ 设置填充字符设置填充字符cout.width(6);/ 设置宽度设置宽度cout.fill(#);/ 设置填充字符设置填充字符c

208、out 123 endl;/ 输出信息输出信息return 0; / 返回值返回值0, 返回操作系统返回操作系统执行后,输出结果是执行后,输出结果是 。A)#123 B)123#C)*123 D)123* 解析:解析:语句语句“cout.fill();”表示设置填充字符,由于最靠近表示设置填充字符,由于最靠近“cout 123 endl;”设置的填充字符为设置的填充字符为“#”,而此前的设置不再有效,因此填,而此前的设置不再有效,因此填充字符是充字符是“#”而不是而不是“*”。“cout. width(6););”表示设置下一个数表示设置下一个数据的输出域宽为据的输出域宽为6,当实际数据小于指

209、定的宽度时,多余的位置将用填充字,当实际数据小于指定的宽度时,多余的位置将用填充字符填满;当实际数据宽度大于指定的宽度时,仍按实际的宽度输出。题中符填满;当实际数据宽度大于指定的宽度时,仍按实际的宽度输出。题中整数整数123的宽度不够的宽度不够6,所以将有,所以将有3个填充字符个填充字符“#”。数值输出的默认对齐。数值输出的默认对齐方式是右对齐,所以最后输出结果是方式是右对齐,所以最后输出结果是#123。答案:答案:A 142实用精品课件PPT3下面关于下面关于C+流的说明中,正确的是流的说明中,正确的是 。A)与键盘、屏幕、打印机和通信端口的交互都可以通过流类来实现)与键盘、屏幕、打印机和通

210、信端口的交互都可以通过流类来实现B)从流中获取数据的操作称为输出操作,向流中添加数据的操作称为输入)从流中获取数据的操作称为输出操作,向流中添加数据的操作称为输入操作操作C)cin是一个预定义的输入流类是一个预定义的输入流类D)输出流有一个名为)输出流有一个名为open()的函数,其作用是生成一个新的流对象的函数,其作用是生成一个新的流对象 解析:解析:选项选项B)将输出操作和输入操作的概念弄反了;选项)将输出操作和输入操作的概念弄反了;选项C中,中,cin是一是一个输入流对象,而不是类;选项个输入流对象,而不是类;选项D错误,可以先建立文件流对象,再在适当错误,可以先建立文件流对象,再在适当

211、的时候用函数的时候用函数open()打开文件,但打开文件,但open()的作用不是生成新的流对象。的作用不是生成新的流对象。答案:答案:A 143实用精品课件PPT4有以下程序:有以下程序:int main()/ 主函数主函数main()cout.fill(*);/ 设置填充字符设置填充字符cout setiosflags(ios:left) setw(4) 123 OK endl;/ 输出信息输出信息return 0; / 返回值返回值0, 返回操作系统返回操作系统执行这个程序,输出结果是执行这个程序,输出结果是 。A)123*OK B)123*OK*C)*1230K D)*123*OK 解

212、析:解析:首先执行语句首先执行语句“cout.fill(*);”,设置填充字符为,设置填充字符为“*”,直到,直到再次设置新填充字符为止。主函数第二行语句再次设置新填充字符为止。主函数第二行语句“cout ios:left setw(4) 123 OK endl;”表示设置对齐方式为左对齐,然后设置表示设置对齐方式为左对齐,然后设置整数整数123的输出宽度为的输出宽度为4,由于,由于123的宽度小于的宽度小于4,故输出,故输出123*,但是输出宽,但是输出宽度的设置只对一次输出有效,故度的设置只对一次输出有效,故“OK“按照默认情况输出,不带填充字符。按照默认情况输出,不带填充字符。答案:答案

213、:A 144实用精品课件PPT5下列关于输入流类成员函数下列关于输入流类成员函数getline()的描述中,错误的是的描述中,错误的是 。A)该函数是用来读取键盘输入的字符串)该函数是用来读取键盘输入的字符串B)该函数读取的字符串长度不受任何限制)该函数读取的字符串长度不受任何限制C)该函数读取字符串时,遇到结束符便停止)该函数读取字符串时,遇到结束符便停止D)该函数读取字符串时,可以包含空格)该函数读取字符串时,可以包含空格 解析:解析:输入流类成员函数输入流类成员函数getline()的作用是用来读取键盘输入的字符串。的作用是用来读取键盘输入的字符串。在读取字符串时,遇到结束符便停止,默认

214、的终止符是回车,而且读取的在读取字符串时,遇到结束符便停止,默认的终止符是回车,而且读取的字符串中可以包括空格。故选项字符串中可以包括空格。故选项A、C、D正确。该函数所能读取的字符串正确。该函数所能读取的字符串的长度接收字符串的数组的有限,选项的长度接收字符串的数组的有限,选项B不正确。不正确。答案:答案:B 145实用精品课件PPT6有以下程序:有以下程序:int main()/ 主函数主函数main()cout setiosflags(ios:fixed) setprecision(3) setfill(*) setw(8);/ 设置输出格式设置输出格式cout 12.345 34.56

215、7 endl;/ 输出信息输出信息return 0; / 返回值返回值0, 返回操作系统返回操作系统若程序的输出如下:若程序的输出如下:*12.345*34.567则程序中横线处遗漏的部分是则程序中横线处遗漏的部分是 。A)setprecision(3)B) setiosflags(ios:fixed)C)setfill(,)D)setw(8) 解析:解析:宽度设置宽度设置setw()的效果只对一次输入或输出有效,而的效果只对一次输入或输出有效,而setprecision()和和setfill()的设置效果一直持续到下一次设置精度或设置填充字符。语句的设置效果一直持续到下一次设置精度或设置填充

216、字符。语句“cout setiosflags(ios:fixed) setprecision(3) setfill(*) data;”中,中,cin是是 。A)C+的关键字的关键字B)类名)类名C)对象名)对象名D)函数名)函数名 解析:解析:cin是是C+预定义的标准输入流对象。预定义的标准输入流对象。答案:答案:C149实用精品课件PPT二、填空题二、填空题 1下面程序的执行结果是下面程序的执行结果是 。int main()/ 主函数主函数main()cout setfill(x) setw(10);/ 设置输出格式设置输出格式cout Hello endl;/ 输出信息输出信息syste

217、m(“PAUSE”);/ 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值0, 返回操作系统返回操作系统解析:解析:setfill(x )设置填充字符为设置填充字符为“x”,setw (10 )设置输出宽度为设置输出宽度为10,由,由于于“Hello”的宽度为的宽度为5,而默认对齐方式为右对齐,所以输出结果中在,而默认对齐方式为右对齐,所以输出结果中在Hello的左边要填充的左边要填充5个字符个字符“x”。答案:答案:xxxxxHello 150实用精品课件PPT2在在C+流类库中,根基类为流类库中,根基类为 。解析:解析:C+流类库中,流

218、类库中,ios是根基类,其余都是它的直接或间接派生类。是根基类,其余都是它的直接或间接派生类。答案:答案:ios151实用精品课件PPT3在下面程序的横线处填上适当的内容,使程序执行后,从键盘输入一个字符串,能在下面程序的横线处填上适当的内容,使程序执行后,从键盘输入一个字符串,能将结果保存到文件将结果保存到文件out. txt中。中。void WriteFile(char *str)ofstream outFile;/ 文件对象文件对象 (out.txt, ios:binary | ios:app);/ 打开文件打开文件for (int i = 0; stri != 0; i+)outFil

219、e.put(stri);/ 向文件写入字符向文件写入字符outFile.close();/ 关闭文件关闭文件void ClearFile()ofstream outFile(out.txt);/ 文件对象文件对象outFile.close();/ 关闭文件关闭文件int main()/ 主函数主函数main()char str1024;/ 字符串字符串ClearFile();/ 清除文件清除文件cout 请输入串请输入串: endl;/ 提示信息提示信息cin.getline(str, 1024);/ 输入字符串输入字符串WriteFile(str);/ 写文件写文件system(PAUSE)

220、;/ 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值0, 返回操作系统返回操作系统 解析:解析:程序的目的是将输入的字符串写入到文件程序的目的是将输入的字符串写入到文件out. txt中。故第一条横线处应该为通中。故第一条横线处应该为通过过ofstream类对象类对象outFile调用成员函数调用成员函数open以以ios:binary | ios:app的方式打开文件。的方式打开文件。答案:答案:outFile.open 152实用精品课件PPT三、编程题三、编程题 1编写程序用于统计一个文本文件中包含的某个字符出现的次数。编写程序用于

221、统计一个文本文件中包含的某个字符出现的次数。 参考程序参考程序:#include / 编译预处理命令编译预处理命令#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std int main()/ 主函数主函数main()char ch, destCh;/ 字符变量字符变量char fName68;/ 文件名文件名int n = 0;/ 整型变量整型变量ifstream inFile;/ 定义文件对象定义文件对象153实用精品课件PPT1编写程序用于统计一个文本文件中包含的某个字符出现的次数。编写程序用于统计一个文本文件中包含的

222、某个字符出现的次数。 cout fName;/ 输入文件名输入文件名inFile.open(fName, ios:in);/ 打开文件对象打开文件对象if (inFile.fail()/ 打开文件失败打开文件失败cout 打开文件失败打开文件失败! endl;exit(1);/ 退出程序退出程序cout destCh;/ 输入目标字符输入目标字符ch = inFile.get();/ 输入一个字符输入一个字符chwhile (!inFile.eof()if (ch = destCh) n+; / 统计字符统计字符destCh出现的次数出现的次数ch = inFile.get();/ 输入一个字

223、符输入一个字符chinFile.close();/ 关闭文件关闭文件cout destCh 共出现的共出现的 n 次次 endl;system(PAUSE); / 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值, 返回操作系统返回操作系统154实用精品课件PPT2编写程序分别计算编写程序分别计算6!10!,使用,使用setw()控制输出的宽度。控制输出的宽度。 参考程序:参考程序:#include / 编译预处理命令编译预处理命令#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用

224、命名空间std unsigned Fac(unsigned n)/ 返回返回n!unsigned t = 1;/ 连乘积连乘积for (unsigned i = 1; i = n; i+)t = t * i;/ 连乘连乘return t;/ 返回返回tint main()/ 主函数主函数main()for (unsigned n = 6; n = 10; n+) / 输出输出!10!coutsetw(2)n!= setw(10) Fac(n) endl; system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值, 返

225、回操作系统返回操作系统155实用精品课件PPT3编写程序实现以下功能:编写程序实现以下功能:(1)从键盘上输入一系列学生成绩信息)从键盘上输入一系列学生成绩信息(姓名、成绩姓名、成绩),并将这些学生成绩信,并将这些学生成绩信息写入到文件息写入到文件stud.dat中。中。(2)显示文件)显示文件stu.dat中的学生成绩信息。中的学生成绩信息。参考程序:参考程序:#include / 编译预处理命令编译预处理命令#include / 编译预处理命令编译预处理命令#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std stru

226、ct Student/ 学生结构学生结构char name16;/ 姓名姓名float score;/ 成绩成绩;156实用精品课件PPT3编写程序实现以下功能:编写程序实现以下功能:(1)从键盘上输入一系列学生成绩信息)从键盘上输入一系列学生成绩信息(姓名、成绩姓名、成绩),并将这些学生成绩信,并将这些学生成绩信息写入到文件息写入到文件stud.dat中。中。(2)显示文件)显示文件stu.dat中的学生成绩信息。中的学生成绩信息。int main()/ 主函数主函数main()Student s;/ 定义学生对象定义学生对象char answer;/ 定义字符变量定义字符变量fstream

227、 f(stud.dat, ios:out | ios:binary);/ 定义文件对象定义文件对象,这样如果文件不存储将建立一个空文件这样如果文件不存储将建立一个空文件 if (f.fail()/ 打开文件失败打开文件失败cout 打开文件失败打开文件失败! endl;exit(1);/ 退出程序退出程序f.close();/ 关闭文件关闭文件f.open(stud.dat, ios:in | ios:out | ios:binary);/ 再以输入输出方式打开文件再以输入输出方式打开文件157实用精品课件PPT3编写程序实现以下功能:编写程序实现以下功能:(1)从键盘上输入一系列学生成绩信息

228、)从键盘上输入一系列学生成绩信息(姓名、成绩姓名、成绩),并将这些学生成绩信,并将这些学生成绩信息写入到文件息写入到文件stud.dat中。中。(2)显示文件)显示文件stu.dat中的学生成绩信息。中的学生成绩信息。docout s.name s.score;/ 输入姓名与成绩输入姓名与成绩f.write(char *)&s, sizeof(Student);/ 写数据到文件中写数据到文件中cout answer;/ 输入选择输入选择answer = tolower(answer);/ 转换小写字母转换小写字母while (answer != y & answer != n)cout ans

229、wer;/ 输入选择输入选择answer = tolower(answer);/ 转换小写字母转换小写字母 while (answer = y);158实用精品课件PPT3编写程序实现以下功能:编写程序实现以下功能:(1)从键盘上输入一系列学生成绩信息)从键盘上输入一系列学生成绩信息(姓名、成绩姓名、成绩),并将这些学生成绩信,并将这些学生成绩信息写入到文件息写入到文件stud.dat中。中。(2)显示文件)显示文件stu.dat中的学生成绩信息。中的学生成绩信息。cout 学生信息学生信息 endl;/ 输出提示输出提示cout setw(16) 姓名姓名 setw(8) 成绩成绩 endl

230、;f.seekg(0);/ 重新定位于文件开始处重新定位于文件开始处f.read(char *)&s, sizeof(Student);/ 读出第个学生的信息读出第个学生的信息while (!f.eof()/ 文件未结束文件未结束cout setw(16) s.name setw(8) s.score endl;/ 显示学生信息显示学生信息f.read(char *)&s, sizeof(Student);/ 读出学生的信息读出学生的信息f.close();/ 关闭文件关闭文件system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0;

231、/ 返回值返回值, 返回操作系统返回操作系统159实用精品课件PPT*4编写程序实现如下功能:编写程序实现如下功能:(1)从键盘上输入一系列员工工资信息)从键盘上输入一系列员工工资信息(姓名、工资姓名、工资),并将这些员工工资信,并将这些员工工资信息写入到文件息写入到文件employee.dat中。中。(2)显示文件)显示文件employee.dat中的员工工资信息和所有员工的平均工资。中的员工工资信息和所有员工的平均工资。 参考程序:参考程序:#include / 编译预处理命令编译预处理命令#include / 编译预处理命令编译预处理命令#include / 编译预处理命令编译预处理命令

232、using namespace std;/ 使用命名空间使用命名空间std struct Employee/ 员工结构员工结构char name16;/ 姓名姓名float wage;/ 工资工资;160实用精品课件PPTint main()/ 主函数主函数main()Employee e;/ 定义员工对象定义员工对象char answer;/ 定义字符变量定义字符变量float average = 0;/ 平均工资平均工资int n = 0;/ 人数人数fstream f(employee.dat, ios:out | ios:binary);/ 定义文件对象定义文件对象,这样如果文件不存储

233、将建立一个空文件这样如果文件不存储将建立一个空文件 if (f.fail()/ 打开文件失败打开文件失败cout 打开文件失败打开文件失败! endl;exit(1);/ 退出程序退出程序f.close();/ 关闭文件关闭文件f.open(employee.dat, ios:in | ios:out | ios:binary);/ 再以输入输出方式打开文件再以输入输出方式打开文件161实用精品课件PPTdocout e.name e.wage;/ 输入姓名与工资输入姓名与工资f.write(char *)&e, sizeof(Employee); / 写数据到文件中写数据到文件中cout a

234、nswer;/ 输入选择输入选择answer = tolower(answer);/ 转换小写字母转换小写字母while (answer != y & answer != n)cout answer;/ 输入选择输入选择answer = tolower(answer);/ 转换小写字母转换小写字母 while (answer = y);162实用精品课件PPTcout 员工信息员工信息 endl;/ 输出提示输出提示cout setw(16) 姓名姓名 setw(21) 工资工资 endl;f.seekg(0);/ 重新定位于文件开始处重新定位于文件开始处f.read(char *)&e, s

235、izeof(Employee); / 读出第个学生的信息读出第个学生的信息while (!f.eof()/ 文件未结束文件未结束cout setw(16) e.name setw(19) e.wage 元元 0)cout 平均工资平均工资: average / n 元元 endl;f.close();/ 关闭文件关闭文件system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值, 返回操作系统返回操作系统163实用精品课件PPTC+C+面向对象程序设计教程面向对象程序设计教程第第8 8章章 C+C+的其它主题的其它主题

236、习题解答习题解答164实用精品课件PPT一、选择题一、选择题 1下列关于下列关于C+函数的说明中,正确的是函数的说明中,正确的是 。A)内置函数就是定义在另一个函数体内部的函数)内置函数就是定义在另一个函数体内部的函数B)函数体的最后一条语句必须是)函数体的最后一条语句必须是return语句语句C)标准)标准C+要求在调用一个函数之前,如果没定义函数,则必须先声明其要求在调用一个函数之前,如果没定义函数,则必须先声明其原型原型D)编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式)编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式 解析:解析:内置函数是为取代预处理宏函数而

237、引进的,是真正的函数,它的定义内置函数是为取代预处理宏函数而引进的,是真正的函数,它的定义也和普通函数一样,与普通函数的不同只是在函数调用时像宏一样展开使用。也和普通函数一样,与普通函数的不同只是在函数调用时像宏一样展开使用。函数如果没有返回值的话,函数体的最后一条语句可以不用函数如果没有返回值的话,函数体的最后一条语句可以不用return语句。对语句。对于函数重载,如果函数只是函数返回值类型不同,而其他完全相同(参数个于函数重载,如果函数只是函数返回值类型不同,而其他完全相同(参数个数及类型),则不能作为重载函数来使用。数及类型),则不能作为重载函数来使用。答案:答案:C 165实用精品课件

238、PPT2下列有关内置函数的叙述中,正确的是下列有关内置函数的叙述中,正确的是 。A)内置函数在调用时发生控制转移)内置函数在调用时发生控制转移B)内置函数必须通过关键字)内置函数必须通过关键字inline来定义来定义C)内置函数是通过编译器来实现的)内置函数是通过编译器来实现的D)内置函数体的最后一条语句必须是)内置函数体的最后一条语句必须是return语句语句 解析:解析:内置函数不是在调用时发生控制转移的。如果在类体外定义成中函数内置函数不是在调用时发生控制转移的。如果在类体外定义成中函数为内置函数,则应用为内置函数,则应用inline来定义,而在类体内定义的内置成员函数,可以来定义,而在

239、类体内定义的内置成员函数,可以不用关键字不用关键字inline来定义,若把一个函数定义为内置函数后,在程序编译阶来定义,若把一个函数定义为内置函数后,在程序编译阶段,编译器就会把每次调用该函数的地方都直接替换为该函数体中的代码,段,编译器就会把每次调用该函数的地方都直接替换为该函数体中的代码,如果函数的返回值类为为如果函数的返回值类为为void,则其函数体可以没有返回语句,则其函数体可以没有返回语句return。答案:答案:C 166实用精品课件PPT3为取代为取代C中带参数的宏,在中带参数的宏,在C+中使用中使用 。A)重载函数)重载函数B)内置函数)内置函数C)递归函数)递归函数D)友元函

240、数)友元函数 解析:解析:根据各种函数的定义,内置函数是根据各种函数的定义,内置函数是C+与宏功相近,但更安全,所以与宏功相近,但更安全,所以在在C+中,内置函数用于取代中,内置函数用于取代C的宏。的宏。答案:答案:B 167实用精品课件PPT4有以下程序:有以下程序:class Aprivate:double a;/ 数据成员数据成员public:A(int m = 0): a(m) / 构造函数构造函数 / 类型转换函数类型转换函数 return (int)a; ;int main()/ 主函数主函数main()A a = 8.14;/ 定义对象定义对象cout a endl;/ 输出输出

241、a return 0; / 返回值返回值0, 返回操作系统返回操作系统该程序输出为该程序输出为8,则横线处应填入,则横线处应填入 。A)int operator int() constB)int &operator int() constC)operator int() constD)operator(int&) const 解析:解析:横线处缺少的是类型转换(横线处缺少的是类型转换(int)的重载函数声明。由于类型名就是返回)的重载函数声明。由于类型名就是返回值类型,故不需要返回值类型的声明,选项值类型,故不需要返回值类型的声明,选项A、B错误。类型转换为一元运算,错误。类型转换为一元运算,

242、若重载为类若重载为类A的成员函数,则没有参数。的成员函数,则没有参数。答案:答案:C 168实用精品课件PPT二、编程题二、编程题 1编程实现一个一维数组类编程实现一个一维数组类Array,在类,在类Array中重载下标运算符中重载下标运算符“”,并使用异常,并使用异常处理机制提高安全性,要求编写测试程序。处理机制提高安全性,要求编写测试程序。 参考程序参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std / 声明数组类模板声明数组类模板template class Arrayprivate:/ 数据成员数据成员

243、ElemType *elem;/ 存储数据元素值存储数据元素值int size;/ 数组元素个数数组元素个数public:/ 公有函数公有函数Array(int sz): size(sz) elem = new ElemTypesize; / 构造函数构造函数Array() delete elem; / 析构函数析构函数ElemType &operator(int i)/ 下标运算符下标运算符只能重载为成员函数只能重载为成员函数if (i = size)throw 元素位置错元素位置错!;/ 抛出异常抛出异常return elemi;/ 返回返回elemi;169实用精品课件PPT1编程实现一

244、个一维数组类编程实现一个一维数组类Array,在类,在类Array中重载下标运算符中重载下标运算符“”,并,并使用异常处理机制提高安全性,要求编写测试程序。使用异常处理机制提高安全性,要求编写测试程序。 int main()/ 主函数主函数main()try/ 检查异常检查异常int a = 1, 9, 7, 5, 6, 3;/ 定义数组定义数组aint n = 6;/ 数组元素个数数组元素个数Array obj(n);/ 定义数组对象定义数组对象int i;/ 定义临时变量定义临时变量for (i = 0; i n; i+) obji = ai;/ 设置数组元素值设置数组元素值, obji等

245、价于等价于obj.operatorifor (i = 0; i = n; i+) cout obji ;/ 输出元素值输出元素值, obji等价于等价于obj.operatoricout endl;/ 换行换行catch (char *str)/ 捕捉异常捕捉异常/ 处理异常处理异常cout 异常信息异常信息: str endl;/ 输出异常信息输出异常信息system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统170实用精品课件PPT2参考例参考例8.3程序实现一个双精度实型类程

246、序实现一个双精度实型类Double,要求含有转换构造函数和,要求含有转换构造函数和类型转换函数,并编写出测试程序。类型转换函数,并编写出测试程序。 参考程序:参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std / 声明双精度实型类声明双精度实型类class Doubleprivate:/ 数据成员数据成员double num;/ 数据值数据值public:/ 公有函数公有函数Double(double n = 0): num(n) / 转换构造函数转换构造函数operator double() const re

247、turn num; / 类类型转换函数类类型转换函数;int main()/ 主函数主函数main()Double x = 8.9;/ 调用转换构造函数调用转换构造函数Double(8.9)来初始化对象来初始化对象icout x endl;/ 等价于等价于cout i.operator double() endl,调用类类型转调用类类型转/ 换函数换函数operator double()将将i转换为转换为double类型后再输出类型后再输出 system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示,输出系统提示return 0; / 返回值返回值, 返回操作系统返回

248、操作系统171实用精品课件PPT*3编写一个程序,满足:编写一个程序,满足:(1)定义)定义2维点类维点类Point,其中数据成员包括,其中数据成员包括x和和y坐标,成员函数包括构造函坐标,成员函数包括构造函数,显示坐标的函数数,显示坐标的函数Show()。(2)定义两个命名空间)定义两个命名空间ns1和和ns2,各设计一个名称为,各设计一个名称为A的类,在的类,在ns1:A类中类中包括数据成员包括数据成员a,成员函数包括构造函数,返回,成员函数包括构造函数,返回a的函数的函数Geta(),在,在ns2:A类中类中包含数据成员包含数据成员b,成员函数包括构造函数,返回,成员函数包括构造函数,返

249、回b的函数的函数Getb()。(3)从)从ns1:A和和ns2:A这两个类公共派生出一个类这两个类公共派生出一个类B,B类不含数据成员,但类不含数据成员,但成员函数包括构造函数,显示数据的函数成员函数包括构造函数,显示数据的函数Show(),转换为,转换为2维点类的类型转换维点类的类型转换函数函数operator Point()。(4)在主函数中编写一些数据进行测试。)在主函数中编写一些数据进行测试。 参考程序:参考程序:#include / 编译预处理命令编译预处理命令using namespace std;/ 使用命名空间使用命名空间std / 声明维点类声明维点类class Pointp

250、rivate:/ 数据成员数据成员:double x, y;/ x与与y坐标坐标public:/ 公有函数公有函数:Point(double a = 0, double b = 0): x(a), y(b) ;/ 构造函数构造函数void Show() cout ( x , y ) endl; ;172实用精品课件PPT/ 命名空间命名空间ns1namespace ns1 class Aprotected:/ 数据成员数据成员:double a;/ 数据成员数据成员apublic:/ 公有函数公有函数:A(double x = 0): a(x) / 构造函数构造函数double Geta()

251、const return a; / 返回返回a;173实用精品课件PPT/ 定义命名空间定义命名空间ns2namespace ns2 class Aprotected:/ 数据成员数据成员:double b;/ 数据成员数据成员bpublic:/ 公有函数公有函数:A(double x = 0): b(x) ;/ 构造函数构造函数double Getb() const return b; / 返回返回b;174实用精品课件PPTclass B: public ns1:A, public ns2:Apublic:/ 公有函数公有函数:B(double x = 0, double y = 0):

252、ns1:A(x), ns2:A(y) ; / 构造函数构造函数void Show()const/ 显示数据显示数据 cout ( Geta() , Getb() ) endl; operator Point() const return Point(Geta(), Getb(); / 类类型转换函数类类型转换函数;175实用精品课件PPTint main()/ 主函数主函数main()B obj1(18, 16);/ 定义对象定义对象obj1Point obj2 = obj1;/ 定义对象定义对象obj2 obj2.Show();/ 显示坐标显示坐标obj1.Show();/ 显示数据显示数据system(PAUSE);/ 调用库函数调用库函数system( ),输出系统提示信息,输出系统提示信息return 0; / 返回值返回值, 返回操作系统返回操作系统176实用精品课件PPTThank YouThank You更多精品更多精品 敬请关注!敬请关注!

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号