C面向对象程序设计教程陈维兴林小茶课后习题答案doc.docx
《C面向对象程序设计教程陈维兴林小茶课后习题答案doc.docx》由会员分享,可在线阅读,更多相关《C面向对象程序设计教程陈维兴林小茶课后习题答案doc.docx(56页珍藏版)》请在冰豆网上搜索。
C面向对象程序设计教程陈维兴林小茶课后习题答案doc
C++面向对象程序设计教程课后题答案
什么是面向对象程序设计?
面向对象程序设计是一种新的程序设计范型.这种范型的主要特征是:
程序=对象+消息
面向对象程序的基本元素是对象。
主要结构特点是:
第一,程序一般由类的定义和类的使用两部分组成;
第二,程序中的一切操作都是通过向对象发送消息来实现的。
什么是对象?
什么是类?
对象与类之间的关系是什么?
对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。
类就是具有相同的数据和相同的操作的一组对象的集合,也就是说,类是对具有相同数据结构和相同操作的一类对象的描述。
类和对象之间的关系是抽象和具体的关系。
类是多个对象进行综合抽象的结果,一个对象是类的一个实例。
现实世界中的对象有哪些特征?
请举例说明。
现实世界中的对象具有以下特征:
1)每一个对象必须有一个名字以区别于其他对象;
2)用属性来描述对象的某些特征;
3)有一组操作,每组操作决定对象的一种行为;
4)对象的行为可以分为两类:
一类是作用于自身的行为,另一类是作用于其他对象的行为。
例如一个教师是一个对象。
每个教师对象有自己的名字来和别的教师区别。
教师具有编号,姓名,年龄,职称,专业等属性。
教师拥有走路,吃饭,授课等行为
操作。
走路,吃饭是作用于自身的行为,授课是作用于其他对象的行为。
什么是消息?
消息具有什么性质?
一个对象向另一个对象发出的请求成为“消息”。
消息具有以下3个性质:
1)同一个对象可以接收不同形式的多个消息,做出不同的相应;
2)相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的;
3)对消息的响应并不是必须的,对象可以响应消息,也可以不响应。
什么是抽象和封装?
请举例说明。
抽象是将有关事物的共性归纳、集中的过程。
例如:
把所有具有大学生学籍的人归为一类,成为“大学生”,这就是一个抽象。
封装是指把数据和实现操作的代码集中起来放在对象内部,并尽可能隐藏对象的内部细节。
例如:
每一台洗衣机都有出厂日期、机器编号等属性,也有启动、暂停、选择等操作。
人们在使用洗衣机的时候只需要按下对应的按钮,而不用关心具体的内部实现。
这就是封装。
什么是继承?
请举例说明。
继承就是允许派生类使用基类的数据和操作,同时,派生类还可以增加新的操作和数据。
例如:
哺乳动物是一种热血、有毛发、用奶哺育幼崽的动物;狗是有犬牙、食肉、特定的骨骼结构、群居的哺乳动物。
狗就继承了哺乳动物。
若类之间具有继承关系,则他们之间具有什么特征?
若类之间具有继承关系,则他们之间具有下列几个特征:
1)类间具有共享特征(包括数据和操作代码的共享);
2)类间具有差别或新增部分(包括非共享的数据和操作代码);
3)类具有层次结构。
什么是单继承、多继承?
请举例说明。
单继承是指每个派生类只直接继承了一个基类的特征。
例如狗继承自哺乳动物。
多继承是指多个基类派生出一个派生类的继承关系。
比如玩具车同时继承自玩具和车。
什么是多态?
请举例说明。
多态是指不同的对象收到相同的消息时执行不同的操作。
例如,有一个窗口类对象,还有一个棋子类对象。
当我们发出“移动”消息时,两个对象的行为不同。
面向对象程序设计的主要优点是什么?
1.可提高程序的重用性;
2.可控制程序的复杂性;
3.可改善程序的可维护性;
4.能够更好地支持大型程序设计;
5.增强了计算机处理信息的范围;
能够很好地适应新的硬件环境。
简述C++的主要特点。
1)
C++是C的超集,保持与C的兼容。
2)
保持了C的简洁、高效和接近汇编语言等特点,并对
C的
功能作了不少扩充。
用C++编写的程序比C更安全,可读性更好,代码结构更为合理。
3)程序质量高。
4)增加了面向对象机制。
#include
usingnamespacestd;
intmain()
{
inta,b,d,min;
cout<<"Entertwonumbers:
";
cin>>a>>b;
min=a>b?
b:
a;
for(d=2;d{
if(((a%d)==0)&&((b%d)==0))break;
}
if(d==min)
{
cout<<"Nocommondenominators"<
}
cout<<"Thelowestcommondenominatoris"<
}
有效
没有函数声明;
函数定义没有写返回值类型。
(1)等价,函数声明可以省略参数的名字。
(2)不等价,第二个的函数定义不能省略参数的名字。
CDAAB
ACBDC
DC
101
1010
10
20
举例说明可以使用const替代#define以消除#define的不安全性。
#include
usingnamespacestd;
intmain()
{
int
a=
1;
#define
T1a+a
#define
T2T1-T1
cout<<
"T2is"<return
0;
}
上面这个程序,初看应该输出T2is0
但是实际上,得出T2is2
如果把#define换成const,则可以输出想要的结果。
用动态分配空间的方法,计算Fibonacci数列的前20项,并存储到动态分配的空间中。
#include
usingnamespacestd;
intmain()
{
int
*pi=
newint
[20];
*pi=
1;
pi[
1]=
1;
for
(int
i=2;i<
20;i++)
{
pi[i]=pi[i-
2]+pi[i-
1];
}
return0;
}
重载sroot函数,输出一个数的二次方根。
#include
usingnamespacestd;
doublesroot(intnum)
{
return(double)sqrt((double)num);
}
doublesroot(longnum)
{
return(double)sqrt((double)num);
}
doublesroot(doublenum)
{
return(double)sqrt(num);
}
intmain()
{
return0;
}
解决百钱问题。
将一元人民币换成1、2、5分的硬币,有多少种换法?
#include
usingnamespacestd;
intmain()
{
intnum=0;Defaultconstructorcalled.
Defaultconstructorcalled.
Construcotor:
a=1,b=2
Construcotor:
a=3,b=4
Construcotor:
a=5,b=6
Con.
Copycon.
default.
Copycon.
A=5
B=14
A=9
B=14
5,7
Constructing
Constructing
A=5
B=15
A=10
B=15
Destructing
Destructing
voidpintStu();函数只有声明,没有定义。
age是私有成员,不能用对象直接调用。
voidprintStu()和voidsetSno(ints)没有加限定符
Student:
:
voidsetAge(inta)在类中没有声明
构造函数不能定义为私有。
否则无法创建对象。
下面是一个计算器类的定义,请完成该类成员函数的实现。
classcounter
{
public:
counter(intnumber);
voidincrement();ult()<<"";
}
}
修改,通过对象指针访问对象数组,使程序以相反的顺序显示每个对象数组元素的qu*price值。
classbook
{
private:
intqu,price;
public:
book(intqu);
intmult();
};
book:
:
book(
intq)
{
if(q<
1||q>
5)
{
qu=
1;
}
else
{
qu=q;
}
price=
10*qu;
}
intbook:
:
mult()
{
returnqu*price;
}
intmain()
{
bookbooks[5]={
book*p=books;
p+=4;
for(inti=0;i<
1,2,3,4,5};
5;i++)
{
cout<mult()<<
--p;
"";
}
return
0;
}
构建一个类Stock,含字符数组stockcode[]及整型数组成员quan、双精度型数据成员
price。
构造函数含3个参数:
字符数组na[]及q、p。
当定义Stock的类对象时,将对象的
第一个字符串参数赋给数据成员stockcode,第2和第3个参数分别赋给quan、price。
未
设置第2和第3个参数时,quan的值为1000,price的值为.成员函数print没有形参,需
使用this指针,显示对象数据成员的内容。
编写程序显示对象数据成员的值。
#include
usingnamespacestd;
classStock
{
private:
charstockcode[25];
intquan;
doubleprice;
public:
Stock(charna[],
intq=1000,
doublep=;
Stock(charna[]);
voidprint();
};
Stock:
:
Stock(
charna[],
intq=1000,
doublep=
{
strcpy(stockcode,na);
quan=q;
price=p;
}
voidStock:
:
print()
{
cout<<
"stockcode:
"<stockcode<<
"quan:
"
<quan
<<"price:
"
<price<}
intmain()
{
Stockstock1(
Stockstock2(
();
();
"600001",3000,;
"600002");
return
0;
}
编写一个程序,已有若干学生的数据,包括学号、姓名、成绩,要求输出这些学生的数据并计算出学生人数和平均成绩(要求将学生人数和总成绩用静态数据成员表示)。
#include
usingnamespacestd;
classstudent
{
private:
charname[25],studentNo[10];
intscore;
staticintsum;
staticinttotalScore;
public:
student(charna[],charstuNo[],
voidshow();
staticvoidshowTotal();
intsc);
};
student:
:
student(
charna[],
charstuNo[],
intsc)
{
strcpy(name,na);
strcpy(studentNo,stuNo);
score=sc;
++sum;
totalScore+=sc;
}
voidstudent:
:
show()
{
cout<<"姓名:
"<cout<<"学号:
"<cout<<"成绩:
"<}
voidstudent:
:
showTotal()
{
cout<<"总人数:
"<cout<<"平均成绩:
"<<(double)totalScore/sum<}
int
student:
:
sum=
0;
int
student:
:
totalScore=
0;
int
main()
{
students1(
"张无忌",
"111254",
75);
students2(
"李莫愁",
"254114",
60);
students3(
"小龙女",
"112587",
88);
();
();
();
student:
:
showTotal();
return0;
}
有哪几种继承方式?
每种方式的派生类对基类成员的继承性如何?
公有继承,私有继承和保护继承。
基类的私有成员,无论哪种继承方式都不能访问。
公有继承不改变基类的公有和保护成员的访问限制。
私有继承将基类的公有和保护成员都变成私有。
保护继承将基类的公有和保护成员都变成保护。
派生类能否直接访问基类的私有成员?
若否,应如何实现?
不能。
可以在基类里添加一个公有成员函数来访问私有成员,派生类就能继承这个公有成员函数,实现对基类私有成员的访问。
保护成员有哪些特性?
保护成员以公有方式或私有方式继承后的访问特性如何?
保护成员只能被本类或本类的派生类所访问,在类或派生类
外是不能被访问的。
后面一问见第一题的答案。
派生类构造函数和析构函数的执行顺序是怎样的?
构造函数是先执行父类的构造函数,再执行类中其他类对象
的构造函数,再执行本类的构造函数。
如果同级有多个构造函数,则按声明顺序
执行。
析构函数与构造函数的执行顺序刚好相反。
派生类构造函数和析构函数的构造规则是怎样的?
派生类名(参数总表):
基类名(参数总表)
{
派生类新增数据成员的初始化语句
}
派生类中的析构函数与基类无关。
什么是多继承?
多继承时,构造函数与析构函数的执行顺序是怎样的?
多继承是指一个类同时继承自多个不同的基类。
执行顺序同
在类的派生中为何要引入虚基类?
虚基类构造函数的调用顺序是如何规定的?
如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最底层的派生类中会保留这个简介的共同基类数据成员的多份同名成员。
在访问这些同名成员的时候,会产生二义性。
为了解决二义性,引入了虚基类。
1)如果虚基类中定义有带形参的构造函数,并且没有定义默认形式的构造函数,则整个继承结构中,所有直接或间接的派生类都必须在构造函数的成员初始化表中列出对虚基类构造函数的调用,以初始化在虚基类中定义的数据成员。
2)建立一个对象时,如果这个对象中含有从虚基类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。
该派生类的其他基类对虚基类构造函数的调用都自动被忽略。
3)若同一层次中同时包含虚基类和非虚基类,应先调用虚基类的构造函数,再调用非虚基类的构造函数,最后调用派生类的构造函数。
ACCB
ConstructorB1.
ConstructorB2.
ConstructorA.
3
2
1
主食=bread
副食=steak
0,0,0
0,1,0
3,6,9
ConstructorB1.
ConstructorB2.
ConstructorB3.
ConstructorA.
1
2
4,3
4
(1,2)
5,6
(6,9)
classbase1
classbase2
classlevel2
classbase2
classlevel1
classtoplevel
#include
usingnamespacestd;
#include
classtable
{
public:
table(
{
int
p,
int
q)
i=p;
j=q;
}
voidascii(void);
protected:
inti,j;
};
voidtable:
:
ascii()
{
int
k=
1;
for
(;i<=j;i++)
{
cout<4)<
if((k)%12==
0)
{
}
cout<<
"\n";
k++;
}
cout<<
"\n";
}
classder_table:
{
public:
der_table(
{
public
intp,
table
intq,
char*m):
table(p,q)
c=m;
}
void
print();
protected:
char*c;
};
voidder_table:
:
print()
{
cout<table:
:
ascii();
"\n";
}
intmain()
{
der_tableob(
'a','z',"ASCIIvalue---char"
);
();
return
0;
}
#include
usingnamespacestd;
#include
classarea_c1
{
protected:
doubleheight;
doublewidth;
public:
area_c1(doubler,doubles)
{
height=r;
width=s;
}
virtual
doublearea()=
0;
};
classrectangle:
publicarea_c1
{
public:
rectangle(doubler,doubles):
area_c1(r,s){}
virtualdoublearea();
};
doublerectangle:
:
area()
{
returnheight*width;
}
classisosceles:
publicarea_c1
{
public:
isosceles(doubler,doubles):
area_c1(r,s){}
virtualdoublearea();
};
doubleisosceles:
:
area()
{
return
(height*width)/
2;
}
intmain()
{
rectangler(10,5);
isoscelesi(4,6);
area_c1*a;
a=&r;
cout<<"矩形的面积是:
"<area()<a=&i;
cout<<"三角形的面积是:
"<area()<return0;
}
#include
usingnamespacestd;
#include
classTime
{
public:
Time(inth,intm,ints)
{
hours=h;
minutes=m;
seconds=s;
}
voiddisplay()
{
cout<<"出生时间:
"<<<"秒"<}
protected:
inthours,minutes,seconds;
};
classDate
{
p