x794297752 发表于 2020-1-4 21:39

C++面向对象程序设计课后习题答案-陈维兴等人

此为清华大学出版社陈维兴等人编写的《C++面向对象程序设计教程》习题答案,仅供学习参考
停”、“选择”等,当人们使用洗衣机时,只要根据需要按下“选择(洗衣的方式)”“启动”或“暂
停”等按键,洗衣机就会完成相应的工作。这些按键安装在洗衣机的表面,人们通过它们与
洗衣机交流,告诉洗衣机应该做什么。我们无法(当然也没必要)操作洗衣机的内部电路和
机械控制部件,因为它们被装在洗衣机里面,这对于用户来说是隐蔽的,不可见的。
1.6】什么是继承?请举例说明
【解】继承所表达的是类之间的相关关系,这种关系使得某类对象可以继承另外一类
对象的特征和能力。现实生活中,继承是很普遍
汽车
和容易理解的。例如我们继承了我们父母的
些特征,如种族、血型、眼睛的颜色等,父母是我
乘用车
待种车辆
们所具有的属性的基础
图1所示是一个继承的典型例子:汽车继[越野车][轿车[运动车[消防车
承的层次。
以面向对象程序设计的观点,继承所表达的
运动型多用途车
是类之间相关的关系。这种关系使得某一类可
以继承另外一个类的特征和能力。
图1.1
【1.7】若类之间具有继承关系,则它们之间具有什么特征?
解】若类之间具有继承关系,则它们之间具有下列几个特性:
(1)类间具有共享特征(包括数据和操作代码的共享);
(2)类间具有差别或新增部分(包括非共享的数据和操作代码);
(3)类间具有层次结构
假设有两个类A和B,若类B继承类A,则类B包含了类A的特征(包括数据和操作),
同时也可以加入自己所特有的新特性。这时,我们称被继承类A为基类或父类;而称继承
类B为A的派生类或子类。同时,我们还可以说,类B是从类A中派生出来的
【1.8】什么是单继承、多继承?请举例说明。
【解】从继承源上分,继承分为单继承和多继承。
单继承是指每个派生类只直接继承了一个基类的特征。图1.2表示了一种单继承关
系。它表示 Windows操作系统的窗口之间的继承关系。
多继承是指多个基类派生出一个派生类的继承关系。多继承的派生类直接继承了不止
个基类的特征。例如,小孩喜欢的玩具车即继承了车的一些特性,还继承了玩具的一些特
征。如图1.3所示。
窗口
玩具
编辑窗口」[对话窗口
玩具车
图1.2
图1.3
【1.9】什么是多态性?请举例说明。
【解】面向对象系统的多态性是指不同的对象收到相同的消息时执行不同的操作。例

如,有一个窗口( Window)类对象,还有一个棋子( Piece)类对象,当我们对它们发出“移动”
的消息时,“移动”操作在 Window类对象和Pece类对象上可以有不同的行为
C艹+语言支持两种多态性,即编译时的多态性和运行时的多态性。编译时的多态性是
通过函数重载(包括运算符重载)来实现的,运行时的多态性是通过虚函数来实现的。
【1.10】面向对象程序设计的主要优点是什么?
【解】面向对象程序设计本质上改变了人们以往设计软件的思维方式,从而使程序设
计者摆脱了具体的数据格式和过程的束缚,将精力集中于要处理对象的设计和研究上,极大
地减少了软件开发的复杂性,提高了软件开发的效率。面向对象程序设计主要具有以下
优点:
(1)可提高程序的重用性;
(2)可控制程序的复杂性;
(3)可改善程序的可维护性;
(4)能够更好地支持大型程序设计;
(5)增强了计算机处理信息的范围;
(6)能很好地适应新的硬件环境
面向对象程序设计是目前解决软件开发面临难题的最有希望、最有前途的方法之

第2章C++概述
【2.1】简述C++的主要特点
【解】C++语言的主要特点表现在两个方面,一是全面兼容C,并对C的功能作了不少
扩充,二是增加了面向对象的机制,具体表现为
(1)C艹是C的超集,C++保持与C的兼容,这就使许多C代码不经修改就可以为
C+所用,用C编写的众多的库函数和实用软件可以用于C+中。
2)C艹是一个更好的C,它保持了C的简洁、高效和接近汇编语言等特点,并对C的
功能作了不少扩充。用C艹编写的程序比C更安全,可读性更好,代码结构更为合理,C++
的编译系统能够检查出更多的类型错误
(3)用C++编写的程序质量高,从开发时间、费用到形成的软件的可重用性、可扩
充性、可维护性和可靠性等方面有了很大的提高,使得大中型的程序开发变得更加
容易。
(4)增加了面向对象的机制,几乎支持所有的面问对象程序设计特征,体现了近20年
来在程序设计和软件开发领域出现的新思想和新技术,这主要包括
①抽象数据类型;
②封装与信息隐藏;
③以继承方式实现程序的重用;
④以函数重载、运算符重载和虚函数来实现多态性;
⑤以模板来实现类型的参数化
C++语言最有意义的方面是支持面向对象的特征,然而由于C+与C保持兼容,使得
C++不是一个纯正的面向对象的语言,C++既可用于面向过程的结构化程序设计,也可用
于面向对象的程序设计。
【2.2】下面是一个C程序,改写它,使它采用C+风格的I/O语句。
#include< stdio. h>
int main()
I int a, b, d, min;
printf("Enter two numbers: )7
scanf("8d%d",&a,&b)i
min=a>b?b: a
for(d=2; d<min; d++)
if(((a号d)==0)&&((b号d)==0)) break;
if(d==min)
d printf("No common denominators \n"):

return o
printf("The lowest common denominator is d\n", d)
0
【解】修改后的程序如下:
# include<iostream>
sing name space std
int main()
int a, b, d, mini
cout<<"Enter two numbers: "i
min=a>b? b:ai
for (d=2; d<min; d++)
if(((a暑d)==0)&&((b号d)==0)) break;
if(d==min)
i cout<<"No common denominators \n"i
return 0:
cout<<"The lowest common denominator is"<<endl<<d:
return 0:
【2.3】测试下面的注释(它在C++风格的单行注释中套入了类似于C的注释)是否
有效
//this is a strange / way to do a comment *
【解】此注释有效,单行注释中可以嵌套/*………*/方式的注释。
【2.4】以下这个简短的C艹+程序不可能编译通过,为什么?
include< iostream
using name space stai
int main()
cout<< Enter two numbers
cout<<"sum is: <<c
return o
return a+;

【解】不可能通过编译的原因是:在程序中,当一个函数的定义在后,而对它的调用在
前时,必须将该函数的原型写在调用语句之前,而在本程序中缺少函数原型语句。在语句
using namespace std;”后加上函数原型语句“sum(inta,intb);"就可通过编译
【2.5】回答问题。
(1)以下两个函数原型是否等价:
float fun(int a, float b, char * c)i
float fun(int, float, char *)i
(2)以下两个函数的第1行是否等价:
float fun(int a, float b, char c)
float fun (int, float, char *)
【解】
(1)这两个函数原型是等价的,因为函数原型中的参数名可以缺省。
(2)这两个函数的第1行是不等价的,因为这个函数的第1行中必须包含参数名。
【2.6】下列语句中错误的是()
A.int米p= new int(10);
B. int p=new int;
C. int*p=new int;
D. int*p=new int[ 40(0)
【解】D
说明:“int*p= new in(10);”表示动态分配1个整型内存空间,初值为10;
“int*p= new int;”表示动态分配10个整型内存空间;
int*p= new int;”表示动态分配1个整型内存空间;
“int*p= new int(0)”想给一个数组分配内存空间时,对数组进行初始化,这是不
允许的。
【2.7】假设已经有定义“ const char* const name="chen";”下面的语句中正确的是
A. name[3='a'
B. name=""lin
C. name=new char:
D. cout<< name[3;
【解】D
说明:name被定义为指向常量的常指针,所以它所指的内容和本身的内容都不能修
改,而“name3]=a';”修改了name所指的常量,“name="lin";”和“name= new char5];”修
改了常指针,只有D输出一个字符是正确的。
【28】假设已经有定义“ char const name="chen";”下面的语句中正确的是()
A. namel 3
B. name="lin
C. name=new charl]
D. name=new char ('q);
【解】A
说明:name被定义常指针,所以它所指的内容能改变,但指针本身的内容不可以修改,
“name=q;”修改了name所指的内容,是正确的。而“name="lin";"、“name= new char
;”和“name= new char(q);”以不同的方法修改了常指针,都是错误的

【2.9】假设已经有定义“ const char*name="chen";"”,下面的语句中错误的是
A. name='g'
B. name="lin
C. name=new char;
D. name=new char('q);
【解】A
说明:name被定义指向常量的指针,所以它所指的内容不能改变,但指针本身的内
容可以修改,而“name3]=q';”修改了name所指的内容,是错误的。“name=="in";”
new char5];”和“name= new char(q)”以不同的方法修改了常指针,都是正确的
10】重载函数在调用时选择的依据中,()是错误的
A.函数名字
B.函数的返回类型
C.参数个数
D.参数的类型
【解】B
【2.11】在()情况下适宜采用内联函数
A.函数代码小,频繁调用
B.函数代码多,频繁调用
C.函数体含有递归语句
D.函数体含有循环语句
【解】A
【2.12】下列描述中,()是错误的
A.内联函数主要解决程序的运行效率问题
B.内联函数的定义必须出现在内联函数第一次被调用之前
C.内联函数中可以包括各种语句
D.对内联函数不可以进行异常接口声明
【解】C
【2.13】在C++中,关于下列设置默认参数值的描述中,()是正确的。
A.不允许设置默认参数值
B.在指定了默认值的参数右边,不能出现没有指定默认值的参数
C.只能在函数的定义性声明中指定参数的默认值
D.设置默认参数值时,必须全部都设置
【解】B
【2.14】下面的类型声明中正确是()。
A. int a[4;
B.int为p;
Int & g:
.inti,为p=&l;
【解】D
说明:C++中不能建立引用数组和指向引用的指针,也不能建立引用的引用。所以A
B、C是错误的,D是正确的。
【2.15】下面有关重载函数的说法中正确的是()
A.重载函数必须具有不同的返回值类型B.重载函数形参个数必须不同
C.重载函数必须有不同的形参列表
重载函数名可以不同
【解】C
10

【2.16】关于new运算符的下列描述中,()是错误的
A.它可以用来动态创建对象和对象数组
B.使用它创建的对象或对象数组可以使用运算符 delete删除
使用它创建对象时要调用构造函数
D.使用它创建对象数组时必须指定初始值
【解】D
【2.17】关于 delete运算符的下列描述中,()是错误的
A.它必须用于new返回的指针
B.使用它删除对象时要调用析构函数
C.对一个指针可以使用多次该运算符
D.指针名前只有一对方括号符号,不管所删除数组的维数
【解】C
【2.18】写出下列程序的运行结果
# include< iostream>
using namespace stdi
int 1=15:
int main()
i=100;
cout<<::: i<<endl;
return 0:
【解】本程序的运行结果如下:
101
说明:在语句“∷i=i+1;”中赋值号左边“∷i”的中i是全局变量,赋值号右边的i是局部
变量。所以执行该语句的结果是将局部变量i的值加1(即101)后赋值给全局变量i。
【2.19】写出下列程序的运行结果。
include< iostream>
using name space std
void f(int &m, int n)
temp=m
n= temp
int main()
【inta=5,b=10;
f(a, b)i
cout<<a<< #i<<b<<end
return o

【解】本程序的运行结果如下:
1010
说明:函数f(km,n)中第1个参数是引用参数,引用参数是一种按地址传递参数的方
法,对它的调用是传地址调用;而第2个参数是变量参数,对它的调用是传值调用。所以调
用函数f后,实参a的值被改为10,实参b的值不变,仍为10
【2.20】分析下面程序的输出结果。
#include<iostream
using namespace std;
int &f(int &i)
i+=10;
return i
int main()
t int k=0;
int &m=f(k)
cout<<k<<endl;
m=20
cout<<k<<endl
【解】本程序的运行结果如下
20
说明:函数f的参数是变量的引用,对它的调用是传地址调用,所以函数f调用后,主
函数中k的值变为10。又由于m是对函数f的引用,当m被赋值为20时,k的值也变
为20
【2.21】举例说明可以使用 const替代# define,以消除# define的不安全性。
【解】例如,以下程序显示出# define的不安全性
f include<iostream>
using namespace std;
define A 2+4
define a* 3
int main ()
I cout<<B<<endli
return 0
上面程序的运行结果是14,而不是18,但很容易被认为是18
下面程序使用 const替代了# define,就可以消除# define的不安全性
并inc1ude< iostream>

**** Hidden Message *****

页: [1]
查看完整版本: C++面向对象程序设计课后习题答案-陈维兴等人