C++面向对象程序设计教程第3版陈维兴林小茶课后习题答案Word格式文档下载.docx
《C++面向对象程序设计教程第3版陈维兴林小茶课后习题答案Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C++面向对象程序设计教程第3版陈维兴林小茶课后习题答案Word格式文档下载.docx(51页珍藏版)》请在冰豆网上搜索。
同一个对象可以接收不同形式的多个消息,做出不同的相应;
相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的;
对消息的响应并不是必须的,对象可以响应消息,也可以不响应。
1.5
什么是抽象和封装?
抽象是将有关事物的共性归纳、集中的过程。
例如:
把所有具有大学生学籍的人归为一类,成为“大学生”,这就是一个抽象。
封装是指把数据和实现操作的代码集中起来放在对象内部,并尽可能隐藏对象的内部细节。
每一台洗衣机都有出厂日期、机器编号等属性,也有启动、暂停、选择等操作。
人们在使用洗衣机的时候只需要按下对应的按钮,而不用关心具体的内部实现。
这就是封装。
1.6
什么是继承?
继承就是允许派生类使用基类的数据和操作,同时,派生类还可以增加新的操作和数据。
哺乳动物是一种热血、有毛发、用奶哺育幼崽的动物;
狗是有犬牙、食肉、特定的骨骼结构、群居的哺乳动物。
狗就继承了哺乳动物。
1.7
若类之间具有继承关系,则他们之间具有什么特征?
若类之间具有继承关系,则他们之间具有下列几个特征:
类间具有共享特征(包括数据和操作代码的共享);
类间具有差别或新增部分(包括非共享的数据和操作代码);
类具有层次结构。
1.8
什么是单继承、多继承?
单继承是指每个派生类只直接继承了一个基类的特征。
例如狗继承自哺乳动物。
多继承是指多个基类派生出一个派生类的继承关系。
比如玩具车同时继承自玩具和车。
1.9
什么是多态?
多态是指不同的对象收到相同的消息时执行不同的操作。
例如,有一个窗口类对象,还有一个棋子类对象。
当我们发出“移动”消息时,两个对象的行为不同。
1.10
面向对象程序设计的主要优点是什么?
1.可提高程序的重用性;
2.可控制程序的复杂性;
3.可改善程序的可维护性;
4.能够更好地支持大型程序设计;
5.增强了计算机处理信息的范围;
能够很好地适应新的硬件环境。
2.1简述C++的主要特点。
C++是C的超集,保持与C的兼容。
保持了C的简洁、高效和接近汇编语言等特点,并对C的功能作了不少扩充。
用C++编写的程序比C更安全,可读性更好,代码结构更为合理。
程序质量高。
增加了面向对象机制。
2.2
#include<
iostream>
usingnamespacestd;
intmain()
{
inta,b,d,min;
cout<
<
"
Entertwonumbers:
"
;
cin>
>
a>
b;
min=a>
b?
b:
a;
for(d=2;
d<
min;
d++)
{
if(((a%d)==0)&
&
((b%d)==0))break;
}
if(d==min)
Nocommondenominators"
<
endl;
return0;
Thelowestcommondenominatoris"
}
2.3有效
2.4没有函数声明;
函数定义没有写返回值类型。
2.5
(1)等价,函数声明可以省略参数的名字。
(2)不等价,第二个的函数定义不能省略参数的名字。
2.6-2.10CDAAB
2.11-2.15ACBDC
2.16-2.17DC
2.18
101
2.19
1010
2.20
10
20
2.21举例说明可以使用const替代#define以消除#define的不安全性。
inta=1;
#defineT1a+a
#defineT2T1-T1
T2is"
T2<
endl;
上面这个程序,初看应该输出T2is0
但是实际上,得出T2is2
如果把#define换成const,则可以输出想要的结果。
2.22用动态分配空间的方法,计算Fibonacci数列的前20项,并存储到动态分配的空间中。
int*pi=newint[20];
*pi=1;
pi[1]=1;
for(inti=2;
i<
20;
i++)
pi[i]=pi[i-2]+pi[i-1];
2.23重载sroot函数,输出一个数的二次方根。
doublesroot(intnum)
return(double)sqrt((double)num);
doublesroot(longnum)
doublesroot(doublenum)
return(double)sqrt(num);
2.24解决百钱问题。
将一元人民币换成1、2、5分的硬币,有多少种换法?
intnum=0;
//总共换法的总数。
初始化为0。
for(inti=0;
=100;
for(intj=0;
j<
=50;
j++)
if((i+2*j)>
100)
break;
for(intk=0;
k<
=20;
k++)
if((i+2*j+5*k)==100)
num++;
1分"
个;
2分"
5分"
if((i+2*j+5*k)>
num<
2.25输入两个整数,按由小到大的顺序输出。
要求使用变量的引用。
voidswap(int&
a,int&
b)
a=a+b;
b=a-b;
a=a-b;
inta,b;
b;
if(a>
b)
swap(a,b);
a<
"
b<
2.26用二分法求解f(x)=0的根。
doubleFun(doublex)
return35*x+25;
//假设f(x)=35x+25
doublea,b;
if(Fun(a)==0)
x="
do
while((Fun(a)*Fun(b))>
=0);
if(Fun(b)==0)
while
(1)
if(Fun((a+b)/2)==0)
(a+b)/2<
if(Fun(a)*Fun((a+b)/2)<
0)
b=(a+b)/2;
if(Fun(b)*Fun((a+b)/2)<
a=(a+b)/2;
3.1类声明的一般格式是什么?
class类名
[private:
]
私有数据成员和成员函数
public:
公有数据成员和成员函数
3.2构造函数和析构函数的主要作用是什么?
它们各自有什么特性?
构造函数是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化。
构造函数的名字必须与类名相同,而不能由用户任意命名。
它可以有任意类型的参数,但不能具有返回值类型。
析构函数通常用于执行一些清理任务,如释放分配给对象的内存空间等。
析构函数名与类名相同,但它前面必须加一个波浪号。
不能有返回值,也不能有参数。
3.3什么是对象数组?
所谓对象数组,是指每一个数组元素都是对象的数组。
3.4什么是this指针?
它的主要作用是什么?
C++为成员函数提供了一个名为this的指针,这个指针称为自引用指针。
每当创建一个对象时,系统就把this指针初始化为指向该对象。
一个类的所有对象合用一份成员函数,this指针可以帮助对象辨别出当前调用的是自己的那个对象的数据成员和函数。
3.5友元函数有什么作用?
友元函数可以在类的外部访问类的私有成员或保护成员。
3.6
(1)声明并定义了P2,P3,并用默认无参构造函数初始化。
(2)声明并定义了P2,并调用Point类的拷贝构造函数用P1对P2进行初始化。
(3)声明并定义了P2,并调用Point类的拷贝构造函数用P1对P2进行初始化。
(4)调用拷贝构造函数,将P1的成员值赋值给P4的成员。
3.7-3.10BCCB
3.11-3.15BAABA
3.16-3.17BB
3.18
10,20
30,48
50,68
70,80
90,16
11,120
3.19
Constructing
10
100
Destructing
3.20
3objectsinexistence
4objectsinexistenceafterallocation
3objectsinexistenceafterdeletion
3.21
Countingat0
Countingat9
3.22
Defaultconstructorcalled.
Construcotor:
a=1,b=2
a=3,b=4
a=5,b=6
3.23
Con.
Copycon.
default.
3.24
A=5
B=14
A=9
3.25
5,7
22.25
3.26
B=15
A=10
3.27
voidpintStu();
函数只有声明,没有定义。
age是私有成员,不能用对象直接调用。
3.28
voidprintStu()和voidsetSno(ints)没有加限定符Student:
:
voidsetAge(inta)在类中没有声明
3.29
构造函数不能定义为私有。
否则无法创建对象。
3.30下面是一个计算器类的定义,请完成该类成员函数的实现。
classcounter
public:
counter(intnumber);
voidincrement();
//给原始值加1
voiddecrement();
//给原始值减1
intgetvalue();
//取的计数器值
intprint();
//显示计数
private:
intvalue;
};
counter:
counter(intnumber)
value=number;
voidcounter:
increment()
++value;
decrement()
--value;
intcounter:
getvalue()
returnvalue;
print()
value<
3.31根据注释语句提示,实现类Date的成员函数
classDate
voidprintDate();
voidsetDay(intd);
voidsetMonth(intm);
voidsetYear(inty);
intday,month,year;
voidDate:
printDate()
今天是"
year<
年"
month<
月"
day<
日"
setDay(intd)
day=d;
setMonth(intm)
month=m;
setYear(inty)
year=y;
DatetestDay;
testDay.setDay(5);
testDay.setMonth(10);
testDay.setYear(2003);
testDay.printDate();
3.32建立类cylinder,cylinder的构造函数被传递了两个double值,分别表示圆柱体的半径和高度。
用类cylinder计算圆柱体的体积,并存储在一个double变量中。
在类cylinder中包含一个成员函数vol,用来显示每个cylinder对象的体积。
constintPI=3.14;
classcylinder
doubleradius,height,volume;
cylinder(intrad,inthei);
doublegetVolume();
voidvol();
cylinder:
cylinder(intrad,inthei)
radius=rad;
height=hei;
doublecylinder:
getVolume()
volume=PI*radius*radius*height;
returnvolume;
voidcylinder:
vol()
圆柱体的体积是:
volume<
3.33构建一个类book,其中包含有两个私有数据成员qu和price,将qu初始化为1~5,将price初始化为qu的10倍,建立一个有5个元素的数组对象。
显示每个对象数组元素的qu*price值。
classbook
intqu,price;
book(intqu);
intmult();
book:
book(intq)
if(q<
1||q>
5)
qu=1;
else
qu=q;
price=10*qu;
intbook:
mult()
returnqu*price;
bookbooks[5]={1,2,3,4,5};
5;
books[i].mult()<
3.34修改3.33,通过对象指针访问对象数组,使程序以相反的顺序显示每个对象数组元素的qu*price值。
book*p=books;
p+=4;
p->
mult()<
--p;
3.35构建一个类Stock,含字符数组stockcode[]及整型数组成员quan、双精度型数据成员price。
构造函数含3个参数:
字符数组na[]及q、p。
当定义Stock的类对象时,将对象的第一个字符串参数赋给数据成员stockcode,第2和第3个参数分别赋给quan、price。
未设置第2和第3个参数时,quan的值为1000,price的值为8.98.成员函数print没有形参,需使用this指针,显示对象数据成员的内容。
编写程序显示对象数据成员的值。
classStock
charstockcode[25];
intquan;
doubleprice;
Stock(charna[],intq=1000,doublep=8.98);
Stock(charna[]);
voidprint();
Stock:
Stock(charna[],intq=1000,doublep=8.98)
strcpy(stockcode,na);
quan=q;
price=p;
voidStock:
stockcode:
this->
stockcode<
quan:
quan<
price:
price<
Stockstock1("
600001"
3000,5.67);
Stockstock2("
600002"
);