面向对象程序设计课后习题答案Word格式.doc
《面向对象程序设计课后习题答案Word格式.doc》由会员分享,可在线阅读,更多相关《面向对象程序设计课后习题答案Word格式.doc(53页珍藏版)》请在冰豆网上搜索。
类是建立对象的“摸板”,按照这个摸板所建立的一个个具体的对象,就是类的实际例子,通常称为实例。
[1_3]现实世界中的对象有哪些特征?
请举例说明。
对象是现实世界中的一个实体,其具有以下一些特征:
(1)每一个对象必须有一个名字以区别于其他对象。
(2)需要用属性来描述它的某些特性。
(3)有一组操作,每一个操作决定了对象的一种行为。
(4)对象的操作可以分为两类:
一类是自身所承受的操作,一类是施加于其他对象的操作。
例如:
雇员刘名是一个对象
对象名:
刘名
对象的属性:
年龄:
36生日:
1966.10.1工资:
2000部门:
人事部
对象的操作:
吃饭开车
[1_4]什么是消息?
消息具有什么性质?
在面向对象程序设计中,一个对象向另一个对象发出的请求被称为“消息”。
当对象接收到发向它的消息时,就调用有关的方法,执行相应的操作。
消息是一个对象要求另一个对象执行某个操作的规格的说明,通过消息传递才能完成对象之间的相互请求或相互协作。
消息具有以下3个性质:
(1)同一个对象可以接收不同形式的多个消息,做出不同的响应。
(2)相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的。
(3)消息的发送可以不考虑具体的接收者,对象可以响应消息,也可以不响应。
[1_5]什么是方法?
消息和方法的关系是什么?
在面向对象程序设计中,要求某一对象作某一操作时,就向该对象发送一个响应的消息,当对象接收到发向它的消息时,就调用有关的方法,执行响应的操作。
方法就是对象所能执行的操作。
方法包括界面和方法体两部分。
方法的界面也就是消息的模式,它给出了方法的调用协议;
方法体则是实现某种操作的一系列计算步骤,也就是一段程序。
在C++语言中方法是通过函数来实现的,称为成员函数。
消息和方法的关系是:
对象根据接收到的消息,调用相应的方法;
反过来,有了方法,对象才能响应相应的消息。
[1_6]什么是封装和抽象?
在现实世界中,所谓封装就是把某个事物包围起来,使外界不知道该事物的具体内容。
在面向对象程序设计中,封装是指把数据和实现操作的代码集中起来放在对象内部,并尽可能隐蔽对象的内部细节。
对象好象是一个不透明的黑盒子,表示对象属性的数据和实现各个操作的代码都被封装在黑盒子里,从外面是看不见的,更不能从外面直接访问或修改这些数据及代码。
使用一个对象的时候,只需要知道它向外界提供的接口形式而无需知道它的数据结构细节和实现操作的算法。
封装机制可以将对象的使用者与设计者分开,使用者不必知道对象行为实现的细节,只需要使用设计者提供的接口让对象去做。
抽象是人类认识问题的最基本的手段之一。
它忽略了一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。
抽象是对复杂世界的简单表示,抽象强调感兴趣的信息,忽略了不重要的信息。
例如,设计一个学籍管理程序的过程中,考察某个学生对象时,只关心他的姓名、学好、成绩等,而对他的身高、体重等信息就可以忽略。
以一般观点而言,抽象是通过特定的实例(对象)抽象共同性质以后形成概念的过程。
抽象是对系统的简化描述或规范说明,它强调了系统中的一部分细节和特性,而忽略了其他部分。
抽象包括两个方面:
数据抽象和代码抽象(或称为行为抽象)。
前者描述某类对象的属性或状况,也就是此类对象区别于彼类对象的特征物理量;
后者描述了某类对象的共同行为特征或具有的共同操作。
在面向对象程序设计方法中,对一个具体问题的抽象分析的结果,是通过类来描述和实现的。
现在以学生管理程序为例,通过对学生进行归纳、分析,抽取出其中的共性,可以得到如下的抽象描述:
共同的属性:
姓名、学号、成绩等,他们组成了学生数据抽象部分。
用C++语言的数据成员来表示,可以是:
char*name;
intnumber;
floatscore;
共同的行为:
数据录入、数据修改和数据输出等,这构成了学生的行为抽象部分,用C++语言的成员函数表示,可以是:
input();
modify();
print();
如果我们开发一个学生健康档案程序,所关心的特征就有所不同了。
可见,即使对同一个研究对象,由于所研究问题的侧重点不同,就可能产生不同的抽象结果。
[1_7]什么是继承?
继承所表达的是对象类之间的相关关系,这种关系使得某类对象可以继承另一类对象的特征和能力。
现实生活中,继承是很普遍和容易理解的。
例如我们继承了父母的一些特征,如种族、血型、眼睛的颜色等,父母是我们所具有的属性的基础。
继承所表达的是对象之间相关的关系。
这种关系使得某一类可以继承另一个类的特征和能力。
[1_8]若类之间具有继承关系,则它们之间具有什么特征?
(1)类间具有共享特征(包括数据和操作代码的共享)
(2)类间具有差别或新增部分(包括非共享的数据和代码操作)
(3)类间具有层次结构
假设有两个类A和B,若类B继承类A,则类B包含了类A的特征(包括数据和操作),同时也可以加入自己所特有的新特性。
这时,我们称被继承类A为基类或父类或超类;
而称继承类B为A类的派生类或子类。
同时,我们还可以说,类B是从类A中派生出来的。
[1_9]什么是单继承、多继承?
从继承源上分,继承分为单继承和多继承。
单继承是指每个派生类只直接继承了一个基类的特征。
多继承是指多个基类派生出一个派生类的继承关系。
多继承的派生类直接继承了不止一个基类的特征。
小孩的玩具车继承了车的一些特性,还继承了玩具的一些特征。
[1_10]什么是多态性?
举例说明。
多态性也是面向对象程序设计的重要特性。
它是指不同的对象收到相同的消息时产生不同的行为方式。
例如我们同样双击windows系统桌面上的图标时,有的是打开多媒体播放器,有的是打开资源管理器。
利用多态性,用户只需发送一般形式的消息,而将所有的实现留给接收消息的对象。
对象根据所收到的消息做出相应的动作。
[1_11]什么是函数重载和运算符重载?
为什么要使用重载?
重载一般包括函数重载和运算符重载。
函数重载是指一个表示符可同时用于为多个函数命名,而运算符重载是指一个运算符可同时用于多种运算。
也就是说,相同名字的函数或运算符在不同的场合可以表现出不同的行为。
使用重载的目的是为了更好地表达行为共享,这种行为共享就象将相似的操作划分在一起。
使用重载可以使程序员在只知道操作的一般含义,而不知道操作的具体细节的情况下能正确地对某个对象使用一个操作。
另外,使用重载的直接益处是减少了程序员记忆操作的名字的负担。
第二章:
:
C++基础
[2_1]简述C++的主要特点
(1)C++保持与C的兼容,用C编写的软件可以用到C++中。
(2)用C++编写的程序可读性好,代码结构更合理,可直接地在程序中映射问
题空间的结构。
(3)生成代码的质量高。
(4)软件的可重用性、可扩充性、可维护性和可靠性有了明显的提高,从而节省了开发费用和时间。
(5)支持面向对象的机制,可方便地构造出模拟现实问题的实体和操作。
[2_2]下面是一个C程序,改写它,使它采用C++风格的i/o语句
改写如下:
#include<
iostream.h>
main()
{inta,b,d,min;
cout<
<
”entertwonumbers:
“;
cin>
>
a;
b;
min=a>
b?
b:
for(d=2;
d<
min;
d++)
if((a%b)==0)&
&
((b%d)==0))break;
if(d==min)
{cout<
”nocommondenominators\n”;
return0;
}
cout<
”thelowestcommondenominatoris“<
endl<
d;
return0;
}
[2_3]测试下面的注释是否有效?
此注释有效,单行注释中可以嵌套/*……….*/方式的注释。
[2_4]以下简单的C++程序不可能编译通过,为什么?
原因是:
在程序中,当一个函数的定义在后,而对它的调用在前时,必须将该函数的原型写在调用语句之前,而在本程序中缺少函数原型语句。
在语句:
后加上语句sum(inta,intb);
就可以通过了。
[2_5]
(1)答:
这两个函数原形是等价的,因为函数原型中的参数名可以缺省。
(2)答:
这两个函数的第一行是不等价的,函数的第一行中必须包含参数名。
(3)答:
这两个函数原型是等价的,因为在函数原型中未注明参数,C++认为该函数的参数表为空(void)
[2_6]答:
输出结果为:
1020因为f函数的参数是引用,所以修改k的值有效。
函数调用后,主函数中k的值变为10。
由于m是对函数的引用,当m被赋
值为20时,k的值也变为20。
[2_7]举例说明可以使用const替代#define以消除#define的不安全性
答:
#defineA2+4
#defineBA*3
voidmain()
{cout<
B<
endl;
}
上面程序的运行结果是14而不是18,但很容易被认为是18。
用const替代#define就能得到正确结果,从而消除了#define的不安全性。
constA=2+4;
constB=A*3;
voidmain()
运行结果为18。
[2_8]答:
使用内联函数的优点主要有两个:
一是能加快代码的执行,减少调用
开销;
二是能消除宏定义的不安全性。
[2_9]用动态分配空间的方法计算Fibonacci数列的前20项并存储到动态分配的
空间中。
#include“stdio.h”
{intI,*p=newint[20];
//动态分配20个整型空间
*p=1;
*(p+1)=1;
//前面两个空间赋值1
*p<
”\t”<
*(p+1)<
”\t”;
p=p+2;
//p指向第三个空间
for(i=3;
i<
=20;
i++)
{*p=*(p-1)+*(p-2);