ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:28.48KB ,
资源ID:6246488      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6246488.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C++第四章习题解答要点.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

C++第四章习题解答要点.docx

1、C+第四章习题解答要点第四章 类与对象习题一.基本概念与基础知识自测题4.1 填空题5.1.1 引入类定义的关键字是 (1) 。类的成员函数通常指定为 (2) ,类的数据成员通常指定为 (3) 。指定为 (4) 的类成员可以在类对象所在域中的任何位置访问它们。通常用类的 (5) 成员表示类的属性,用类的 (6) 成员表示类的操作。答案:(1)class(2)公有的public(3)私有的private(4)公有的public(5)数据(6)函数4.1.2 类的访问限定符包括 (1) 、 (2) 和 (3) 。私有数据通常由(4) 函数来访问(读和写)。这些函数统称为 (5) 。答案:(1)pu

2、blic(公有的)(2)private(私有的)(3)protected(保护的)(4)公有的成员函数(5)类的接口4.1.3 通常在逻辑上,同一类的每个对象都有 (1) 代码区,用以存储成员函数。而在物理上通常只有 (2) 代码区。只有在 (3) 定义,并 (4) 的函数和加了关键字 (5) 的函数例外。答案:(1)独立的(2)共用的(3)在类说明中(4)不包括循环等复杂结构(5)inline4.1.4 C+中支持三种域: (1) 、 (2) 、 (3) 。函数域被包括在 (4) 中,全局域被包括在 (5) 中。using指示符以关键字using开头,后面是关键字 (6) ,最后是 (7)

3、。这样表示以后在该名字空间中所有成员都 (8) 。如不使用using指示符则在使用时要加:,称为 (9) 运算符。答案:(1)局部域(local scope)(2)名字空间域(namespace scope)(3)类域(class scope)(4)局部域(5)名字空间域(6)namespace(7)名字空间名(8)可以直接被使用(9)域4.1.5 引用通常用作函数的 (1) 和 (2) 。对数组只能引用 (3)不能引用 (4) 。答案:(1)参数(2)返回值(3)数组元素(4)数组名本身4.1.6 构造函数的任务是 (1) 。构造函数无 (2) 。类中可以有 (3) 个构造函数,它们由 (4

4、) 区分。如果类说明中没有给出构造函数,则C+编译器会 (5) 。拷贝构造函数的参数是 (6) ,当程序没有给出复制构造函数时,系统会自动提供 (7) 支持,这样的复制构造函数中每个类成员 (8) 。答案:(1)初始化数据成员(2)函数返回类型说明(3)多(4)不同的参数表(5)自动给出一个默认的构造函数(6)同一类对象的引用(7)默认的的复制构造函,称为默认的按成员语义支持。(8)被依次复制4.1.7 一个类有 (1) 个析构函数。 (2) 时,系统会自动调用析构函数。答案:(1)一(2)对象注销时4.1.8 运算符重载时,其函数名由 (1) 构成。成员函数重载双目运算符时,左操作数是 (2

5、) ,右操作数是 (3) 。答案:(1)关键字operator和该运算符(2)对象(3)该函数的参数4.1.9 面向过程的程序设计中程序模型描述为 (1) ,面向对象程序设计的程序模型可描述为 (2) 。答案:(1)“程序=算法+数据结构”。其数据与数据处理是分离的。(2)程序=(对象+对象+对象)+消息;对象=(算法+数据结构)。面向对象设计将数据和对数据的操作方法放在一起,形成一个相对独立的整体对象(Object),并通过简单的接口与外部联系。对象之间通过消息(Message)进行通讯。4.2 简答题4.2.1 简单解释什么是面向对象程序设计的封装性。答:对象是一个封装体,在其中封装了该对

6、象所具有的属性和操作。对象作为独立的基本单元,实现了将数据和数据处理相结合的思想。此外,封装特性还体现在可以限制对象中数据和操作的访问权限,从而将属性“隐藏”在对象内部,对外只呈现一定的外部特性和功能。封装性增加了对象的独立性,C+通过建立数据类型类,来支持封装和数据隐藏。一个定义完好的类一旦建立,就可看成完全的封装体,作为一个整体单元使用,用户不需要知道这个类是如何工作的,而只需要知道如何使用就行。另一方面,封装增加了数据的可靠性,保护类中的数据不被类以外的程序随意使用。这两个优点十分有利于程序的调试和维护。4.2.2 C+编译器怎样对标识符进行解析?答:编译器对标识符的解析分两步,第一步查

7、找在声明中用到的标识符,特别是函数成员声明中用到的参数类型,第二步是函数成员体内的标识符。4.2.3 为什么说类与对象的概念是客观世界的反映?答:客观世界的事物都具有某些属性和行为(或操作),具有相同属性和行为的事物可以归属于一类,用分类的方法可以提高认识事物的效率。C+中定义的类则是通过抽象的方法将某一类事物共有的静态特征(属性)和动态特征(行为)概括出来并加以描述,而对象是类的具体实现,所以说类与对象的概念是客观世界的反映。4.2.4 什么叫类域?为什么说类域是抽象的?答:类域是类体所包括的范围。每个类定义都引入了一个独立的类域,在类域中说明的标识符仅在该类的类域中有效。由于类只是一个说明

8、,看上去有数据,有函数,有类型定义,但是它并非实体,不分配内存,当然也不能运行。所以说类域是抽象的。4.2.5 引用作为函数参数时为什么能实现两个实参之间的数据交换?为什么对应实参不能为引用?为什么返回值为引用的函数可以作为左值?答:引用变量是其关联变量的别名,二者在内存中占据同一个存储单元。在一个以引用作为参数的函数中,交换两个参数的值,实际上就是交换两个实参的值。如果函数的参数是引用,调用时需要取得实参的地址,而实参如果已经是一个地址,再进行引用将产生错误,故对应实参不能为引用。函数返回引用实际是指明(返回)了相应的关联变量,所以声明返回值为引用的函数实际上是将关联变量作为左值参与运算。4

9、.2.6 什么是缺省的构造函数?缺省的构造函数最多可以有多少个?答:如果在类定义中不显式地定义构造函数,C+编译器会自动产生一个缺省的构造函数,不过该函数不做具体的初始化工作。只要构造函数是无参的或者只要各参数均有缺省值的,C+编译器都认为是缺省的构造函数。缺省的构造函数只能有一个。4.2.7 拷贝构造函数用于哪三个方面?答:(1)用类的一个对象去初始化该类的另一个对象时使用。(2)当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用。(3)当函数的返回值是类对象,函数执行结束返回调用者时使用。4.2.8 写出含有对象成员的类的构造函数的格式,并做简单说明。答:C+中对含对象成员的类对

10、象的构造函数有固定的格式:类名:构造函数名(参数总表):对象成员1(参数名表1),对象成员2(参数名表2),对象成员n(参数名表n)冒号后用逗号隔开的是要初始化的对象成员,附在后面的参数名表1,参数名表n依次为调用相应对象成员所属的构造函数时的实参表。这些表中的参数通常来自冒号前的参数总表,但没有类型名。4.2.9 所有类对象未重载的赋值运算符“”是怎样工作的?为什么它可以进行连续赋值?答:对所有的类对象,未重载的赋值运算符“ =”称作缺省的按成员拷贝赋值操作符,同类对象之间可以用“=”直接拷贝。因为缺省的赋值操作返回一个对象的引用,所以它可以进行连续赋值。4.2.10 为什么在友元函数的函数

11、体内访问对象成员时,必须用对象名加运算符“”再加对象成员名?答:友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。这一点和一般函数一样。4.2.11 重载复数运算符时,采用下面友元函数声明:friend Complex operator+(Complex &c1,Complex &c2);为什么不能用于“实数+复数”?怎样改进才能适用?为什么?答:使用引用类型变量作为运算符重载函数的参数,身为左值的实数类型实参不能被转换为复数,编译时无法通过。添加const说明,使实数到复数的转换隐式地在一份拷贝上进行,则可以实现“实数+复数”运算。修改后的说明为:

12、friend Complex operator+(const Complex &c1, const Complex &c2);4.2.12 类的静态数据成员与函数中的静态成员有何异同?答:类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中,为该类所有对象公用。函数中的静态变量也位于公用内存中,不随函数调用而重新分配,所以总是保留上次进入并执行该函数后留下的信息。4.2.13 C+中结构、联合与类三者间有何异同?答:在C+中结构(structure)与类几乎是完全一样的类型,差别仅仅在于缺省情况下结构的成员为公有的。联合(union)是C+的导出数据类型,在语法与功能上

13、类似于结构,二者的区别是:结构变量的各成员同时被分配了各自独立的内存区,而联合变量的各个成员的存储开始地址都相同,所以在任一时刻联合变量只能存储一个成员。4.2.14 对象的第一特征是封装,那么由对象组成的面向对象的程序怎样建立各对象之间的有效联系?面向对象程序的组织与面向过程有什么不同?答:因为对象的操作主要用来响应外来消息并为其他对象提供服务,所以面向对象的程序利用消息传递机制来建立各对象之间的有效联系,协调各对象的运行。一个对象可以向其他对象发送消息以请求服务,也可以响应其他对象传来的消息,完成自身固有的某些操作,从而服务于其他对象。 面向过程的程序是模块化的,模块的组织具有分层结构特点

14、,层与层之间是调用关系。面向对象程序是由一个个封装的对象组成,而对象是由紧密结合在一起的算法和数据结构组成。对象之间是相互请求和相互协作的关系。4.2.15 简叙Windows下应用程序的运行方式。答:Windows系统支持多个应用程序同时执行,在界面形式上,它支持多个窗口同时活动。它的运行机制是“消息传递和事件驱动(message based and event driven)”。Windows系统使用事件驱动的编程模式。所谓事件的含义非常广泛。输入设备的动作,如敲打键盘、按鼠标等会产生一系列的事件(注意不是一个事件)。操作系统所作的一举一动也被当作某种类型的事件,应用程序也会产生各种事件。

15、事件用来标识发生的某件事情。Windows系统对于应用程序环境中发生的每一个事件都会以对应的某种消息的形式标识,并放入相应的Windows建立的消息队列中,然后由对应的应用程序或窗口函数去处理。窗口函数处理是分层的,前面处理不了的送到后面,最后处理不了剩下的全由缺省的窗口函数处理。4.2.16 类的成员函数在什么情况下应该定义为私有的?这样做的目的是什么?答:除接口函数和创建本类对象的构造函数和撤消该对象的析构函数外。其余成员函数应该定义为私有的,这是开发类时故意对外隐蔽起来的操作,而这些往往是最复杂最关键的部分。类中故意的隐藏也为以后的升级扩展留下了余地,只要接口不变,内部再变,也不必修改原

16、来的程序,就象MFC(微软基础类)升级后,由MFC底层类所编的程序完全不必修改,自动升级。二编程与综合练习题4.3 构造一个日期时间类(Timedate),数据成员包括年、月、日和时、分、秒,函数成员包括设置日期时间和输出时间,其中年、月请用枚举类型,并完成测试。(包括用成员函数和用普通函数)解:本题要求仅是定义类的练习,并非实用的提供日期时间的程序。实用的日期时间程序见附录二的日期时间函数。#include #include using namespace std;enum YRY2000,Y2001,Y2002,Y2003,Y2004,Y2005;/enum MTJan,Feb,Mar,A

17、pr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec;class Timedateprivate: YR year; MT month; int date; int hh; int mm; int ss;public: Timedate()year=Y2000;month=Jan;date=1;hh=0;mm=0;ss=0; Timedate(YR a,MT b,int c) year=a; month=b; date=c; hh=12;mm=30;ss=0; void getdate(YR &,MT &,int &);/使用引用一次取得3个数值 void gettime(in

18、t &,int &,int &); void putdate(YR ,MT ,int ); void puttime(int ,int ,int ); void list();void Timedate:getdate(YR &y,MT &m,int &d) y=year; m=month; d=date;void Timedate:gettime(int &a,int &b,int &c) a=hh; b=mm; c=ss;void Timedate:putdate(YR a,MT b,int c) year=a; month=b; date=c;void Timedate:puttime(

19、int a,int b,int c) hh=a; mm=b; ss=c;void Timedate:list()/成员函数,直接访问私有的数据成员 coutyear/month/date :; switch(year) case Y2000:cout2000;break; case Y2001:cout2001;break; case Y2002:cout2002;break; case Y2003:cout2003;break; case Y2004:cout2004;break; case Y2005:cout2005;break; switch(month) case Jan:cout/

20、Jan;break; case Feb:cout/Feb;break; case Mar:cout/Mar;break; case Apr:cout/Apr;break; case May:cout/May;break; case Jun:cout/Jun;break; case Jul:cout/Jul;break; case Aug:cout/Aug;break; case Sep:cout/Sep;break; case Oct:cout/Oct;break; case Nov:cout/Nov;break; case Dec:cout/Dec;break; cout/dateendl;

21、 couthour:minite:second :; couthh:mm:ssendl;void list(Timedate td)/普通函数,通过接口函数访问私有的数据成员 YR year; MT month; int date; int hh; int mm; int ss; td.getdate(year,month,date); coutyear/month/date :; switch(year) case Y2000:cout2000;break; case Y2001:cout2001;break; case Y2002:cout2002;break; case Y2003:co

22、ut2003;break; case Y2004:cout2004;break; case Y2005:cout2005;break; switch(month)/, case Jan:cout/Jan;break; case Feb:cout/Feb;break; case Mar:cout/Mar;break; case Apr:cout/Apr;break; case May:cout/May;break; case Jun:cout/Jun;break; case Jul:cout/Jul;break; case Aug:cout/Aug;break; case Sep:cout/Se

23、p;break; case Oct:cout/Oct;break; case Nov:cout/Nov;break; case Dec:cout/Dec;break; td.gettime(hh,mm,ss); cout/dateendl; couthour:minite:second :; couthh:mm:ssendl; int main() Timedate A(Y2004,Mar,3),B; A.list(); B.list(); B.putdate(Y2005,Oct,18); B.puttime(17,30,00); list(B); return 0;4.4 设计并测试一个矩形

24、类(Rectangle),属性为矩形的左下与右上角的坐标,矩形水平放置。操作为计算矩形周长与面积。测试包括用成员函数和普通函数。解:这里的矩形的4边分别与x轴y轴平行,为最简单的情况。注意参数有缺省值的函数的声明和定义格式。#include #include using namespace std;class Rectangle double left, top ; double right, bottom;public: Rectangle(double l=0, double t=0, double r=0, double b=0); Rectangle(); /析构函数,在此函数体为空

25、void Assign(double l,double t,double r,double b); double getLeft() return left; / 以下四个函数皆为内联成员函数 double getRight() return right; double getTop()return top; double getBottom()return bottom; void Show(); double Area(); double Perimeter();/ 构造函数,带缺省参数,缺省值为全0,在声明中指定Rectangle:Rectangle(double l , double

26、t, double r, double b) left = l; top = t; right = r; bottom = b; void Rectangle:Assign(double l, double t, double r, double b)/赋值 left = l; top = t; right = r; bottom = b;void Rectangle:Show()/成员函数直接使用私有的数据成员 coutleft-top point is (left,top)n; coutright-bottom point is (right,bottom)n;double Rectang

27、le:Area() return fabs(right-left)*(bottom-top);double Rectangle:Perimeter() return 2*(fabs(right-left)+fabs(bottom-top);int main() Rectangle rect; rect.Show(); rect.Assign(100,200,300,400); rect.Show(); Rectangle rect1(0,0,200,200); rect1.Show(); Rectangle rect2(rect1); rect2.Show(); cout面积rect.Area

28、()t周长rect.Perimeter()endl; return 0;4.5 定义一个圆类(Circle),属性为半径(radius)、圆周长和面积,操作为输入半径并计算周长、面积,输出半径、周长和面积。要求定义构造函数(以半径为参数,缺省值为0,周长和面积在构造函数中生成)和拷贝构造函数。解:通常所有数据成员都在构造函数中赋初值。拷贝构造函数以本类的引用为参数。#include#includeusing namespace std;class Circle double r,Area,Circumference;public: Circle(double a=0); Circle(Circ

29、le &); void SetR(double R); double GetR()return r; double GetAreaCircle()return Area; double GetCircumference()return Circumference;Circle:Circle(double a) r=a; Area=r*r*3.14159265; Circumference=2*r*3.14159265;Circle:Circle(Circle & cl) r=cl.r; Area=cl.Area; Circumference=cl.Circumference;void Circle:SetR(double R) r=R; Area=r*r*3.14159265; Circumference=2*r*3.14159265;int main() Circle c

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1