
《C面向对象程序设计习题与上机解答》由会员分享,可在线阅读,更多相关《C面向对象程序设计习题与上机解答(98页珍藏版)》请在文档大全上搜索。
1、 C+面对对象程序设计习题与上机实验题解答陈维兴 陈昕 编著人民邮电出版社 目 录第1章 面对对象方法概述1.1 习题参考解答第2章 C+的初步知识2.1 习题参考解答2.2 上机实验题参考解答第3章 类和对象3.1 习题参考解答3.2 上机实验题参考解答第4章 类和对象的进一步商量4.1 习题参考解答4.2 上机实验题参考解答第5章 继承与派生5.1 习题参考解答5.2 上机实验题参考解答第6章 多态性与虚函数6.1 习题与参考解答6.2 上机实验题与参考解答第7章 运算符重载7.1 习题参考解答7.2 上机实验题参考解答第8章 模板8.1 习题参考解答8.2 上机实验题参考解答第9章 C+
2、的输入和输出9.1 习题参考解答9.2 上机实验题参考解答第10章 异常处理和命名空间10.1 习题参考解答10.2 上机实验题参考解答第11章 综合设计与实现11.1 习题参考解答11.2 上机实验题参考解答第1章 面对对象方法概述1.1 习题参考解答【1.1】【解】面对过程程序设计的主要特征是:程序由过程定义和过程调用组成(所谓过程,简洁地说,就是程序执行某项操作的一段代码,函数是最常用的过程。),从这个意义动身, 基于面对过程的程序可以用以下的公式来表述:程序 = 过程 + 调用【1.2】 【解】面对过程程序设计中普遍接受的优化方法是使用结构化程序设计方法,其局限性至少有以下几个方面:
3、(1) 面对过程程序设计方法开发软件的生产效率低下(2) 面对过程程序设计方法难以应付日益庞大的信息量和多样的信息类型 (3) 面对过程程序设计方法难以适应各种新环境【1.3】 【解】 面对对象程序设计是一种新的程序设计范型。这种范型的主要特征是:程序 = 对象 + 消息对于面对对象的程序设计,程序员注意的是类的设计和编写,即问题域中涉及几个类,各个类之间的关系如何,每个类包含哪些数据和函数(操作代码),再由类生成其对象。程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法(通过成员函数)完成相应的操作。【1.4】 【解】现实世界中的对象,具有以下特性:(1) 有一个
4、名字:每一个对象必须有一个名字,称为对象名,以区分于其他对象;(2) 有一组属性:用属性来描述它的某些特征,一般可以用数据来表示,全部的属性都有值;(3) 有一组行为: 对象的行为或功能也称为方法,一般用一组操作来描述;(4) 有一组接口:除施加于对象内部的操作外,对象还供应了一组公有操作用于与外界接口,从而可以与其他对象建立关系。【1.5】【解】在面对对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。“类”就是具有相同的数据(属性)和相同的操作代码(函数)的一组对象的集合。类和对象之间的关系是抽象和简略的关系。类是多个对象进行综合抽象的结果,一个对象是
5、类的一个实例。【1.6】 什么是消息?【解】面对对象程序设计技术必须供应一种机制允许一个对象与另一个对象的交互。这种机制叫消息传递。一个对象向另一个对象发出的恳求被称为“消息”。【1.7】 【解】在面对对象程序设计中的消息传递实际是对现实世界中的信息传递的直接模拟。调用对象中的函数就是向该对象传送一个消息,要求该对象实现某一行为(功能)。对象所能实现的行为(功能),在程序设计方法中称为方法,它们是通过调用相应的函数来实现的,在C+语言中方法是通过成员函数来实现的。【1.8】 【解】在面对对象程序设计中,抽象是通过特定的实例(对象)抽取共同特性后形成概念的过程。C和C+中的数据类型就是对一批简略
6、的数的抽象。例如,“整型数据”是对全部整数的抽象。封装是面对对象程序设计方法的一个重要特性,所谓封装具有两方面的含义:一是将有关的数据和操作代码封装在一个对象中,各个对象相对独立、相不干扰。二是将对象中某些数据与操作代码对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。这种对外界隐蔽的做法称为信息隐蔽。信息隐蔽有利于数据平安,防止无关人员访问和修改数据。【1.9】 【解】以面对对象程序设计的观点,继承所表达的是类之间相关的关系。这种关系使得某一类可以继承另外一个类的特征和能力。若类之间具有继承关系,则它们之间具有下列几个特性: (1) 类间具有共享特征(包括数据和操作
7、代码的共享); (2) 类间具有差别或新增部分(包括非共享的数据和操作代码); (3) 类间具有层次结构。【1.10】 【解】从继承源来分,继承分为单继承和多继承。单继承是指每个派生类只直接继承了一个基类的特征。例如,图1.1表示了一种单继承关系。它表示Windows操作系统的窗口之间的继承关系。 窗口对话窗口编辑窗口 图1.1 单继承示意图多继承是指多个基类派生出一个派生类的继承关系。多继承的派生类直接继承了不止一个基类的特征。例如,小孩喜爱的玩具车即继承了车的一些特性,还继承了玩具的一些特征。如图1.2所示。 车 玩具 玩具车图1.2 多继承示意图【1.11】【解】多态性是面对对象程序的重
8、要特征。多态性是指不同的对象收到相同的的消息时执行不同的操作。例如,我们同样双击Window系统桌面上的图标时,有的是打开多媒体播放器,有的是打开资源管理器。多态性增强了软件的敏捷性和重用性,为软件的开发与维护供应了极大的便利。尤其是接受了虚函数和动态联编机制后,允许用户以更为明确、易懂的方式去建立通用的软件。【1.12】 【解】面对对象程序设计的优点主要包括以下几个方面:(1) 可提高程序的重用性面对对象程序设计方法能比较好地解决软件重用的问题。对象所固有的封装性和信息隐藏等机理,使得对象内部的实现与外界隔离,具有较强的独立性,它可以作为一个大粒度的程序构件,供同类程序直接使用。有两种方法可
9、以重复使用一个对象类:一种方法是建立在各种环境下都能使用的类库,供相关程序直接使用;另一种方法是从它派生出一个满足当前需要的新类。继承性机制使得子类不仅可以重用其父类的数据和程序代码,而且可以在父类代码的基础上便利地修改和扩充,这种修改并不影响对原有类的使用。(2) 可掌握程序的简单性面对对象程序设计方法接受了封装和信息隐藏技术,把数据及对数据的操作放在一个个类中,作为相互依存、不行分割的整体来处理。这样,在程序中任何要访问这些数据的地方都只需简洁地通过传递信息和调用方法来进行,这就有效地掌握了程序的简单性。(3) 可改善程序的可维护性在面对对象程序设计方法中,对对象的操作只能通过消息传递来实
10、现,所以只要消息模式即对应的方法界面不变,方法体的任何修改不会导致发送消息的程序修改,这显然对程序的维护带来了便利。另外,类的封装和信息隐藏机制使得外界对其中的数据和程序代码的非法操作成为不行能,这也就大大地削减了程序的错误率。(4) 能够更好地支持大型程序设计类是一种抽象的数据类型,所以类作为一个程序模块,要比通常的子程序的独立性强的多,面对对象技术在数据抽象上又引入了动态连接和继承性等机制,进一步进展了基于数据抽象的模块化设计,使其更好地支持大型程序设计。(5) 增强了计算机处理信息的范围面对对象程序设计方法把描述事物静态属性的数据结构和表示事物动态行为的操作放在一起构成一个整体,完整地、
11、自然地表示客观世界中的实体。用类来直接描述现实世界中的类型,可使计算机系统的描述和处理对象从数据扩展到现实世界和思维世界的各种事物,这实际上大大扩展了计算机系统处理的信息量和信息类型。第2章 C+的初步知识2.1 习题参考解答【2.1】【解】C+语言的主要特点表现在两个方面,一是全面兼容C,并对C的功能作了不少扩允,二是增加了面对对象的机制。简略表现为:(1) C+是C的超集,C+保持与C的兼容,这就使很多C代码不经修改就可以为C+所用,用C编写的众多的库函数和有用软件基本上可以不加修改地用于C+。(2) C+ 是一个更好的C,它保持了C的简洁、高效和接近汇编语言等特点,并对C的功能作了不少扩
12、允。用C+编写的程序比C更平安,可读性更好,代码结构更为合理。(3) 用C+编写的程序质量高,从开发时间、费用到形成的软件的可重用性、可扩充性、可维护性和牢靠性等方面有了很大的提高,使得大中型的程序开发变得更加容易。(4) 增加了面对对象的机制, C+几乎支持全部的面问对象程序设计特征,体现了近20年来在程序设计和软件开发领域消失的新思想和新技术。C+语言最有意义的方面是支持面对对象的特征,然而,由于C+与C保持兼容,使得C+不是一个纯正的面对对象的语言,C+既可用于面对过程的结构化程序设计,也可用于面对对象的程序设计。【2.2】 【解】#include<iostream> /编译
13、预处理命令using namespace std; /使用命令空间stddouble circle(double r) /定义函数circle return 3.14*r*r;double triangle(double h,double w) /定义函数triangle return 0.5*h*w;int main() /定义主函数main double r,h,w; double cs,ts; cout<<"Input r,h,w:" cin>>r>>h>>w; /输入圆的半径和三角形高和底的值 cs= circle(r
14、); /调用函数circle ts= triangle(h,w); /调用函数trianglecout<<"The area of circle is: "<<cs<<endl; /输出圆的面积 cout<<"The area of triangle is:"<<ts; /输出三角形的面积 return 0;程序的一次运行结果如下:Input r,h,w:10 20 10The area of circle is: 314The area of triangle is:100【2.3】【解】B【
15、2.4】【解】C【2.5】【解】C【2.6】【解】C【2.7】 【解】C【2.8】【解】A【2.9】【解】B【2.10】 【解】D【2.11】【解】D【2.12】【解】 C【2.13】【解】 D说明:“int *p=new int(5);”表示动态安排1个整型内存空间,初值为5;“int *p=new int5;”表示动态安排5个整型内存空间;“int *p=new int;”表示动态安排1个整型内存空间;“int *p=new int5(0)”想给一个数组安排内存空间时,对数组进行初始化,这是不允许的。【2.14】 【解】 D说明:name被定义为指向常量的常指针, 这个指针变量所指的地址不
16、能转变,它所指向的地址中的数据也不能转变。“name3=a;”修改了name所指向的地址中的数据,“name="lin"”和“name=new char5;”修改了name所指的地址,只有D输出一个字符是正确的。【2.15】 【解】 A说明:name被定义常指针,它所指向的地址中的数据能转变,但它所指的地址不能转变。“name3=q;”修改了name所指向的地址中的数据,是正确的。而“name="lin"”、“name=new char5;”和“name=new char(q);”以不同的方法修改了name所指的地址,都是错误的。【2.16】【解】 A说
17、明:name被定义指向常量的指针, 它所指向的地址中的数据不能转变,但它所指的地址可以修改,而“name3='q'”修改了name所指向的地址中的数据,是错误的。“name="lin"” 、“name=new char5;”和“name= new char(q)”以不同的方法修改了name所指的地址,都是正确的。【2.17】【解】C【2.18】【解】 D说明:C+中不能建立引用数组和指向引用的指针,也不能建立引用的引用。所以A、B、C是错误的,D是正确的。【2.19】【解】A【2.20】【解】B【2.21】【解】(1) 这两个函数原型是等价的,由于函数原型中
18、的参数名可以缺省。(2) 这两个函数的第一行是不等价的,函数的第一行中必须包含参数名。【2.22】【解】不行能通过编译的缘由是:在程序中,当一个函数的定义在后,而对它的调用在前时,必须将该函数的原型写在调用语句之前,而在本程序中缺少函数原型语句。在语句“using namespace std;”后加上函数原型语句“sum(int a,int b);”就可通过编译。【2.23】【解】本程序的运行结果如下:x+y=65【2.24】【解】本程序的运行结果如下:101说明: 在语句“:i=i+1;”中赋值号左边“:i”的中i是全局变量,赋值号右边的i是局部变量。所以执行该语句的结果是将局部变量i的值加
19、1(即101)后赋值给全局变量i。【2.25】【解】本程序的运行结果如下:10 10说明:函数f(&m,n)中 第1个参数是引用参数, 引用参数是一种按地址传递参数的方法,对其的调用是传地址调用;而第2个参数是变量参数,对它的调用是传值调用。所以调用函数f后, 实参a的值被改为10, 实参b的值不变,仍为10。【2.26】【解】本程序的运行结果如下:1020说明:函数f的参数是变量的引用, 对它的调用是传地址调用,所以函数f调用后,主函数中k的值变为10。又由于m是对函数f的引用,当m被赋值为20时,k的值也变为20 。【2.27】 【解】程序的作用是:输入3个整数,然后输出其中值最大
20、的数。在主函数中输入3个整数,然后调用f函数,在f函数中实现找最小的整数,用if语句比较两个数,将大者存放在变量m中,经过两个if语句的比较,m中存放的是3个整数中最大的数。运行情况如下:2 4 7 (输入3个整数)7 (输出其中最大的数)【2.28】 【解】实现本题功能的程序如下:#include<iostream>#include<cmath>using namespace std;int main() float x,y; cout<<"please input 2 floats to x,y:" cin>>x>&
21、gt;y; float z=pow(x,y); cout<<"pow("<<x<<","<<y<<")="<<z<<endl; return 0;本程序的运行结果是:please input 2 floats to x,y:2.1 3pow(2.1,3)=9.261说明:由于要用到系统函数pow(x,y),所以要包含头文件cmath。【2.29】【解】实现本题功能的程序如下:#include<iostream> using namespac
22、e std;int main() int *p=new int20; /动态安排20个整型内存空间 *p=1; *(p+1)=1; /对前面2个内存空间赋值1 cout<<*p<<"t"<<*(p+1)<<"t" p=p+2; /p指向第3个内存空间 for (int i=3;i<=20;i+) *p=*(p-1)+*(p-2); cout<<*p<<"t" if (i%5=0) cout<<endl;p+; /p指向下一个内存空间;return
23、 0;本程序的运行结果是:1 1 2 3 58 13 21 34 5589 144 233 377 610987 1597 2584 4181 6765【2.30】 【解】实现本题功能的程序如下:#include<iostream> #include<cmath> using namespace std;double sroot(int i) return sqrt(i);double sroot(long l) return sqrt(l); double sroot(double d) return sqrt(d);int main() int i=12; long
24、 l=1234; double d=12.34;cout<<"i的二次方根是:"<<sroot(i)<<endl;cout<<"l的二次方根是:"<<sroot(l)<<endl;cout<<"d的二次方根是:"<<sroot(d)<<endl;return 0;本程序的运行结果是:i的二次方根是:3.4641l的二次方根是:35.1283d的二次方根是:3.512832.2 上机实验题参考解答【2.1】 【实验步骤】在第一次上
25、机时,按以下步骤建立和运行C+程序:(1) 先进入Visual C+6.0环境。(2) 编辑 C+源程序。依据第12章介绍的单文件程序的编辑方法,在自己指定的子名目中(例如D:C+)建立一个名为test1_1.cpp的新文件(此时尚未向文件输入内容) ,并从键盘输入以上的源程序。(3) 编译C+程序。 选择“Build(编译)Compile test2_1.cppp(编译test2_1.cpp)”命令,对此源程序进行编译。观察和分析编译信息。(注:以上括号中的内容是Visual C+ 6.0中文版中的中文显示,以下同。)依据编译信息指出的错误,修改程序,再进行编译。如果还有错,再重复此过程,直
26、到编译信息提示:“test2_1.obj - 0 error(s),0 warming(s)”,即既没有error类型的语法错误,也没有warming类型的语法错误,这时产生一个test2_1.obj文件。 (4)连接C+程序。选择“Build(编译)Build test2_1.exe(构建test2_1.exe)”命令,对程序进行连接,如果不出错,就会生成可执行程序test2_1.exe。(5) 运行C+程序。选择“BuildExecute test2_1.exe(执行Execute test2_1.exe)”命令,执行可执行程序test2_1.exe。观察屏幕的变化。在输出窗口应显示如下运
27、行结果: Hello!This is a program.(6) 分析运行结果。分析结果是否正确,如果不正确或认为输出格式不抱负,可以修改程序,然后重新执行以上步骤。(7) 关闭工作空间。在执行完一个程序,编辑和运行新的程序前,应执行“File(文件)->Close Workspace(关闭工作区)”命令,则结束对该程序的的操作。若要退出VC+环境,则执行“File(文件)->Exit(退出)”命令。【运行结果】Hello!This is a program.【2.2】 【错误分析】 编译程序,提示有4个error错误,1个warming错误。 编译出错信息告知在第3行有2个err
28、or错误,第1个错误的缘由是cout未经声明,第2个错误的缘由是运算符“<<”不合法。这都是由于流对象cout是标准的输出流对象,它在文件iostream中声明,因此必须包含头文件iostream。因此应添加以下语句:#include<iostream>using namespace std; 编译出错信息告知在第5行有2个error错误。第1个error错误的缘由是运算符“<<”不合法,缘由与第3行的相同。第5行的第2个error错误缘由是第5行少了1个分号“;”,这是由于每条语句需要由分号作为结束符。也许读者要问,明明这两个错误都是消失在第4行,为什么说
29、成第5行有错呢?这是由于C+允许将一条语句分写成几行,检查完第4行没有分号后,必须检查下一行,直到发现第5行的“” 前都没有“;” 时,才判定出错。因此在第5行报错。修改方法是:在第5行语句的末尾加上“;”。 编译出错信息告知第5行有1个warming错误,缘由是main函数默认的返回值类型是int, 而main函数中没有返回值。修改方法:在“”前加上返回语句“return 0;”。【修改后的程序】/test2_2_1_2.cpp#include<iostream>using namespace std;int main() cout<<"Hello!n&qu
30、ot; cout<<"Welcome to C+!"<<endl; return 0;【运行结果】Hello!Welcome to C+!(2)/test2_2_2_1.cpp#include<iostream>using namespace std;int main() int x,y; x=5; y=6; int z=x*y; cout<<"x*y="<<z<<endl; return 0;)【错误分析】 编译程序,提示有2个error错误。第1个错误信息告知在第11行出错,出错
31、缘由是“” 错写成“)”; 由于同样的缘由造成了第2个错误,即第12行找不到文件的结束符。修改方法:将“)”改为“”。 【修改后的程序】/test2_2_2_2.cpp#include<iostream>using namespace std;int main() int x,y; x=5; y=6; int z=x*y; cout<<"x*y="<<z<<endl; return 0;【运行结果】x*y=30(3)/test2_2_3_1.cpp#include<iostream>using namespace
32、std; int main() void fun(int,int&); int x,y; fun(3,x); fun(4,y); cout<<"x+y=<<x+y<<endl; return 0;void fun(int m,int &n) n=m*5【错误分析】本题有两处错误:) 语句“cout<<"x+y=<<x+y<<endl;”缺少一个“"”号,应将其修改为: cout<<"x+y="<<x+y<<endl;) 函
33、数fun中的语句“n=m*5”缺少一个“;”号,应将其修改为:n=m*5;【修改后的程序】/test2_2_3_2.cpp#include<iostream>using namespace std;int main() void fun(int,int&); int x,y; fun(3,x); fun(4,y); cout<<"x+y="<<x+y<<endl; return 0;void fun(int m,int &n) n=m*5;【运行结果】x+y=35 【结果分析】 使用引用作函数的形参时,调用函数
34、的实参要用变量名。实参传递给形参,相当于在被调用函数中使用了实参的别名。于是,在被调用函数中对形参的操作实质是对实参的操作,即数据的传递是双向的。 程序在第1次调用fun()时,使得x得到的值是15;程序在第2次调用fun()时,使得y得到的值是35。【2.3】 【参考程序】/test2_3.cpp#include<iostream>using namespace std;int maxl(int x,int y) return(x>y ? x:y);int maxl(int x,int y,int z) int temp=maxl(x,y);return(temp>z
35、 ? temp:z);double maxl(double x,double y) return(x>y ? x:y);double maxl(double x,double y,double z) double temp=maxl(x,y); return(temp>z ? temp:z);char maxl(char x,char y) return(x>y ? x:y);int maxl(char x,char y,char z) int temp=maxl(x,y);return(temp>z ? temp:z);int main() int x1,x2;dou
36、ble d1,d2;char c1,c2;x1=maxl(3,5);x2=maxl(4,5,8);c1=maxl('a','b');c2=maxl('d','e','h');d1=maxl(3.1,5.6);d2=maxl(15.3,13.4,27.8);cout<<"maxl(3,5)="<<x1<<endl;cout<<"maxl(4,5,8)="<<x2<<endl;cout<<&quo
37、t;maxl(3.1,5.6)="<<d1<<endl;cout<<"max1(15.3,13.4,27.8)="<<d2<<endl;cout<<"maxl('a','b')="<<c1<<endl;cout<<"maxl('d','e','h')="<<c2<<endl;return 0;【运行结果】maxl(3
38、,5)=5maxl(4,5,8)=8maxl(3.1,5.6)=5.6max1(15.3,13.4,27.8)=27.8maxl('a','b')=bmaxl('d','e','h')=h【2.4】 【参考程序】/test2_4.cpp#include<iostream>using namespace std;void change(char&,char&);int main() char x,y;cin>>x>>y;if(x<y)change(x,y);
39、/如果x<y,使x和y的值互换cout<<"max="<<x<<" min="<<y<<endl;return 0;void change(char &t1,char &t2) /函数的作用是使t1与t2互换 char temp;temp=t1;t1=t2;t2=temp;【运行结果】g jmax=j min=g【2.5】【参考程序】/test2_5.cpp#include<iostream>using namespace std;int main() doub
40、le *r; r=new double; cin>>*r; cout<<"Area is:"<<3.14*(*r)*(*r)<<endl; delete r;return 0;【运行结果】12.34Area is:478.145第3章 类和对象3.1 习题参考解答【3.1】 【解】 类声明的一般格式如下:class 类名public: 公有数据成员;公有成员函数;private:私有数据成员;私有成员函数; ;类的声明由关键字class打头,后跟类名,花括号中是类体,最后以一个分号“;”结束。【3.2】【解】C【3.3】【解】
41、B【3.4】【解】B【3.5】【解】D【3.6】【解】B说明:C+中对构造函数有一些规定:不能带返回值;可以不带参数;也可以缺省定义;但构造函数的名字与类名必须完全相同。【3.7】【解】B【3.8】【解】C【3.9】【解】C【3.10】【解】B【3.11】【解】C说明:C+中对析构函数也有一些规定:没有参数;不能重载;析造函数的名字与是在类名前加“”;析构函数不能指定返回类型。【3.12】 【解】C【3.13】【解】C【3.14】【解】B【3.15】【解】D【3.16】 【解】语句(1)使用带默认参数的构造函数,或不带参数的构造函数,定义了point类的两个对象p2和p3;语句(2)在建立新对
42、象p2时,用已经存在的对象P1去初始化新对象p2,在这个过程中用“赋值法”调用了拷贝构造函数。语句(3)在建立新对象p2时,用已经存在的对象P1去初始化新对象p2,在这个过程中用“代入法”调用了拷贝构造函数。语句(4)将对象p1数据成员的值拷贝到对象p4中, 这个过程是通过默认赋值运算符函数实现的。【3.17】【解】本程序的运行结果如下:Exit maindst 55【3.18】【解】本程序的运行结果如下: Counting at 0 Counting at 1 Counting at 2 Counting at 3 Counting at 4 Counting at 5 Couhting a
43、t 6 Counting at 7 Counting at 8 Counting at 9说明:在本程序中主函数main只包括了一个return语句,但竟然有内容输出!什么时候调用了构造函数?我们知道,构造函数在对象被定义时调用。那么对象anObject是何时被调用的呢?在主函数main之前,语句“test anObject”处。【3.19】【解】本程序的运行结果如下:Con.Copy con.default.【3.20】【解】 第1个错误:printStu()和setSno两个成员函数没有用public定义,不允许外部函数对对象进行操作。第2个错误:成员函数在类外定义,应加上类名“Stude
44、nt:”。第3个错误:setAge应在类中说明,并且在类外定义时,应加上类名“Student:”。【3.21】【解】构造函数Point是私有的,语句“Point cpoint;”执行时消失错误。【3.22】【解】 实现本题功能的程序如下:#include<iostream> using namespace std;class Circlepublic: Circle(float r)radius=r; float area()return 3.14*radius*radius;private: float radius;int main() float r;cout<<
45、"请输入圆的半径:"cin>>r;Circle p(r);cout<<"半径为"<<r<<"的圆的面积为:"<<p.area()<<endl;return 0;程序的运行结果是:请输入圆的半径:3半径为3的圆的面积为:28.26【3.23】 【解】实现本题功能的程序如下:#include<iostream> using namespace std;class cylinderpublic: cylinder(double a,double b); vo
46、id vol();private: double r,h; double volume;cylinder:cylinder(double a,double b) r=a; h=b; volume=3.141592*r*r*h;void cylinder:vol() cout<<"volume is:"<<volume<<"n"int main() cylinder x(2.2,8.09); x.vol();return 0;程序的运行结果是:volume is:123.011【3.24】【解】实现本题功能的程序如下:#
47、include<iostream> using namespace std;class Date public: Date() Date(int y,int m,int d) year=y; mon=m; day=d; Date(Date&d) year=d.year; mon=d.mon; day=d.day; void SetDate(int Y,int m,int d) year=Y; mon=m; day=d; void printDate() cout<<"日期是:"<<year<<"年"
48、<<mon<<"月"<<day<<"日"<<endl; int GetYear() return year; int GetMonth() return mon; int GetDay() return day; private: int day,mon,year;void main() Date d1(2010,6,8);cout<<"日期是:"<<d1.GetYear()<<"年"<<d1.GetMont
49、h()<<"月"<<d1.GetDay()<<"日"<<endl; Date d2; d2.SetDate(2010,8,1);d2.printDate(); Date d3(d1);d3.printDate();程序的运行结果是:日期是:2010年6月8日日期是:2010年8月1日日期是:2010年6月8日3.2 上机实验题参考解答【3.1】 (1)【运行结果】Copy-initialization Constructor is calledCopy-initialization Constructor
50、is calledp3=(3,4)Destructor is callededDestructor is callededDestructor is calleded (2)【运行结果】Constructor is Called.Copy-initialization Constructor is calledCopy-initialization Constructor is calledp3=(3,4)Destructor is callededDestructor is callededDestructor is calleded【结果分析】 创建对象p1时,调用带有两个参数的构造函数,
51、输出第1行结果。 创建对象p2和p3时,调用拷贝构造函数,输出第2行和第3行结果。 当程序运行结束,释放对象p3、p2和p1时, 分别调用析构函数输出最后3行结果。(3)【错误分析】 调试程序时,发现添加的两条语句有错。这是由于Coordinate类中没有供应适合创建对象p4和p5的构造函数。为了解决这个问题,可以增加一个默认构造函数和带一个参数的构造函数,但最简洁的方法是修改带有两个参数的构造函数, 使参数带有默认值。如: Coordinate(int x1=0,int y1=0);这样,创建对象p4时,2个参数分别使用默认值0和0;而创建对象p5时, 第1个参数为2,第2个参数使用默认值0
52、。(4) 【运行结果】Constructor is Called.Copy-initialization Constructor is calledCopy-initialization Constructor is calledp3=(3,4)Constructor is Called.Constructor is Called.Destructor is callededDestructor is callededDestructor is callededDestructor is callededDestructor is calleded【结果分析】从输出结果可以看出,程序调用了3次
53、构造函数,2次拷贝构造函数。 创建对象时,将依据参数的情况调用相应的构造函数。程序在执行语句Coordinate pl(3,4);Coordinate p4;Coordinate p5(2);创建对象p1、p4和p5时,调用了3次构造函数。 当用类的一个对象去创建该类的另一个对象时,将调用拷贝构造函数。程序在执行语句Coordinate p2(p1);Coordinate p3=p2;创建对象p2和p3时,调用了2次拷贝构造函数。【2.2】【参考程序】/test3_2.cpp#include<iostream>using namespace std;#include<ioma
54、nip>class magic /声明魔方类magicpublic: void getdata(); /输入初值成员函数 void setfirstmagic(); /设置初始魔方成员函数 void generatemagic(); /生成最终魔方成员函数 void printmagic(); /显示魔方成员函数private:int m44; int step; /相邻元素之间的差值 int first; /起始值 int sum; /最大元素值和最小元素值的和;void magic:getdata() /输入初值成员函数 cout<<"输入4*4魔方起始值:&q
55、uot; cin>>first; cout<<"输入相邻元素差值:"cin>>step;void magic:setfirstmagic() /设置初始魔方成员函数 int i,j; int tmp; tmp=first; for (i=0;i<4;i+) for (j=0;j<4;j+) mij=tmp; tmp+=step; void magic:generatemagic() /生成最终魔方成员函数 sum=m00+m33; for (int i=0,j=0;i<4;i+,j+) mij=sum-mij; for(
56、 i=0,j=3;i<4;i+,j-) mij=sum-mij;void magic:printmagic() /显示魔方成员函数 int i,j; for (i=0;i<4;i+) for (j=0;j<4;j+) cout<<setw(5)<<mij; cout<<endl; int main() magic A; A.getdata(); A.setfirstmagic(); cout<<"初始魔方如下:"<<endl; A.printmagic(); A.generatemagic();
57、cout<<"最终魔方如下:"<<endl; A.printmagic(); return 0;【运行结果】程序的一次执行结果如下:输入4*4魔方起始值:1输入相邻元素差值:2初始魔方如下: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31最终魔方如下: 31 3 5 25 9 21 19 15 17 13 11 23 7 27 29 1【3.3】【参考程序】 /test3_3.cpp#include<iostream>#include<string>using namespace std;
58、const len=5;int main() int i;void Reverse(string s);string strlen="Germany","Japan","America","Britain","France"cout<<"按逆转前的挨次输出字符串:"<<endl;for(i=0;i<len;i+) cout<<stri<<" " /按逆转以前的挨次输出字符串 cout<<en
59、dl;Reverse(str); /进行逆转cout<<"按逆转后的挨次输出字符串:"<<endl;for(i=0;i<len;i+) cout<<stri<<" " /按逆转后的挨次输出字符串 cout<<endl;return 0;void Reverse(string s) string t; for( int i=0;i<len/2;i+) t=si; si=slen-1-i; slen-1-i=t;【运行结果】按逆转前的挨次输出字符串:Germany Japan Ameri
60、ca Britain France按逆转后的挨次输出字符串:France Britain America Japan Germany第4章 类和对象的进一步商量4.1 习题参考解答【4.1】【解】 所谓对象数组是指每一数组元素都是对象的数组,也就是说,若一个类有若干个对象,我们把这一系列的对象用一个数组来存放。对象数组的元素是对象,不仅具有数据成员,而且还有函数成员。【4.2】【解】对象指针就是用于存放对象地址的变量。声明对象指针的一般语法形式为: 类名* 对象指针名;【4.3】【解】B【4.4】【解】C【4.5】【解】B说明:C+中规定,在建立对象前就可以为静态数据成员赋值。同时规定在静态成员函数中不能使用this指针;静态成员函数在类外定义时,不需要用static前缀;静态成员函数既可以在类内定义也可以在类外定义。【4.6】【解】D 【4.7】【解】C 【4.8】【解】D 【4.9】【解】A【4.10】【解】A