WORD格式.分享精品.资料C++面向对象程序设计教程课后题答案1.1什么是面向对象程序设计?面向对象程序设计是一种新的程序设计范型.这种范型的主要特征是:程序=对象+消息面向对象程序的基本元素是对象。主要结构特点是:第一,程序一般由类的定义和类的使用两部分组成;第二,程序中的一切操作都是通过向对象发送消息来实现的。1.2什么是对象?什么是类?对象与类之间的关系是什么?对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。类就是具有相同的数据和相同的操作的一组对象的集合,也就是说,类是对具有相同数据结构和相同操作的一类对象的描述。类和对象之间的关系是抽象和具体的关系。类是多个对象进行综合抽象的结果,一个对象是类的一个实例。1.3现实世界中的对象有哪些特征?请举例说明。现实世界中的对象具有以下特征:1)每一个对象必须有一个名字以区别于其他对象;2)用属性来描述对象的某些特征;3)有一组操作,每组操作决定对象的一种行为;WORD格式.分享精品.资料4)对象的行为可以分为两类:一类是作用于自身的行为,另一类是作用于其他对象的行为。例如一个教师是一个对象。每个教师对象有自己的名字来和别的教师区别。教师具有编号,姓名,年龄,职称,专业等属性。教师拥有走路,吃饭,授课等行为操作。走路,吃饭是作用于自身的行为,授课是作用于其他对象的行为。1.4什么是消息?消息具有什么性质?一个对象向另一个对象发出的请求成为“消息”。消息具有以下3个性质:1)同一个对象可以接收不同形式的多个消息,做出不同的相应;2)相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的;3)对消息的响应并不是必须的,对象可以响应消息,也可以不响应。1.5什么是抽象和封装?请举例说明。抽象是将有关事物的共性归纳、集中的过程。例如:把所有具有大学生学籍的人归为一类,成为“大学生”,这就是一个抽象。封装是指把数据和实现操作的代码集中起来放在对象内部,并尽可能隐藏对象的内部细节。例如:每一台洗衣机都有出厂日期、机器编号等属性,也有启动、暂停、选择等操作。人们在使用洗衣机的时候只需要按下对应的按钮,而不用关心具体的内部实现。这就是封装。1.6什么是继承?请举例说明。继承就是允许派生类使用基类的数据和操作,同时,派生类还可以增加新的操作和数据。WORD格式.分享精品.资料例如:哺乳动物是一种热血、有毛发、用奶哺育幼崽的动物;狗是有犬牙、食肉、特定的骨骼结构、群居的哺乳动物。狗就继承了哺乳动物。1.7若类之间具有继承关系,则他们之间具有什么特征?若类之间具有继承关系,则他们之间具有下列几个特征:1)类间具有共享特征(包括数据和操作代码的共享);2)类间具有差别或新增部分(包括非共享的数据和操作代码);3)类具有层次结构。1.8什么是单继承、多继承?请举例说明。单继承是指每个派生类只直接继承了一个基类的特征。例如狗继承自哺乳动物。多继承是指多个基类派生出一个派生类的继承关系。比如玩具车同时继承自玩具和车。1.9什么是多态?请举例说明。多态是指不同的对象收到相同的消息时执行不同的操作。例如,有一个窗口类对象,还有一个棋子类对象。当我们发出“移动”消息时,两个对象的行为不同。1.10面向对象程序设计的主要优点是什么?1.可提高程序的重用性;2.可控制程序的复杂性;3.可改善程序的可维护性;4.能够更好地支持大型程序设计;5.增强了计算机处理信息的范围;能够很好地适应新的硬件环境。2.1简述C++的主要特点。WORD格式.分享精品.资料1)C++是C的超集,保持与C的兼容。2)保持了C的简洁、高效和接近汇编语言等特点,并对C的功能作了不少扩充。用C++编写的程序比C更安全,可读性更好,代码结构更为合理。3)程序质量高。4)增加了面向对象机制。2.2#includeiostreamusingnamespacestd;intmain(){inta,b,d,min;coutEntertwonumbers:;cinab;min=ab?b:a;for(d=2;dmin;d++){if(((a%d)==0)&&((b%d)==0))break;}if(d==min){coutNocommondenominatorsendl;return0;}coutThelowestcommondenominatorisdendl;return0;}2.3有效2.4没有函数声明;WORD格式.分享精品.资料函数定义没有写返回值类型。2.5(1)等价,函数声明可以省略参数的名字。(2)不等价,第二个的函数定义不能省略参数的名字。2.6-2.10CDAAB2.11-2.15ACBDC2.16-2.17DC2.181012.1910102.2010202.21举例说明可以使用const替代#define以消除#define的不安全性。#includeiostreamWORD格式.分享精品.资料usingnamespacestd;intmain(){inta=1;#defineT1a+a#defineT2T1-T1coutT2isT2endl;return0;}上面这个程序,初看应该输出T2is0但是实际上,得出T2is2如果把#define换成const,则可以输出想要的结果。2.22用动态分配空间的方法,计算Fibonacci数列的前20项,并存储到动态分配的空间中。#includeiostreamusingnamespacestd;intmain(){int*pi=newint[20];*pi=1;pi[1]=1;for(inti=2;i20;i++){pi[i]=pi[i-2]+pi[i-1];}return0;}2.23重载sroot函数,输出一个数的二次方根。WORD格式.分享精品.资料#includeiostreamusingnamespacestd;doublesroot(intnum){return(double)sqrt((double)num);}doublesroot(longnum){return(double)sqrt((double)num);}doublesroot(doublenum){return(double)sqrt(num);}intmain(){return0;}2.24解决百钱问题。将一元人民币换成1、2、5分的硬币,有多少种换法?#includeiostreamusingnamespacestd;intmain(){intnum=0;//总共换法的总数。初始化为0。for(inti=0;i=100;i++){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)WORD格式.分享精品.资料{num++;cout1分i个;2分j个;5分k个;endl;}if((i+2*j+5*k)100){break;}}}}coutnumendl;return0;}2.25输入两个整数,按由小到大的顺序输出。要求使用变量的引用。#includeiostreamusingnamespacestd;voidswap(int&a,int&b){a=a+b;b=a-b;a=a-b;}intmain(){inta,b;cinab;if(ab){swap(a,b);}couta,bendl;return0;}2.26用二分法求解f(x)=0的根。WORD格式.分享精品.资料#includeiostreamusingnamespacestd;doubleFun(doublex){return35*x+25;//假设f(x)=35x+25}intmain(){doublea,b;cina;if(Fun(a)==0){coutx=aendl;return0;}do{cinb;}while((Fun(a)*Fun(b))=0);if(Fun(b)==0){coutx=bendl;return0;}if(ab){a=a+b;b=a-b;a=a-b;}while(1){if(Fun((a+b)/2)==0){coutx=(a+b)/2endl;return0;}WORD格式.分享精品.资料if(Fun(a)*Fun((a+b)/2)0){b=(a+b)/2;}if(Fun(b)*Fun((a+b)/2)0){a=(a+b)/2;}}return0;}3.1类声明的一般格式是什么?class类名{[private:]私有数据成员和成员函数public:公有数据成员和成员函数}3.2构造函数和析构函数的主要作用是什么?它们各自有什么特性?构造函数是一种特殊的成员函数,它主要用于为对象分配空间,进行初始化。构造函数的名字必须与类名相同,而不能由用户任意命名。它可以有任意类型的参数,但不能具有返回值类型。析构函数通常用于执行一些清理任务,如释放分配给对象的内存空间等。析构函数名与类名相同,但它前面必须加一个波浪号。不能有返回值,也不能有参数。3.3什么是对象数组?WORD格式.分享精品.资料所谓对象数组,是指每一个数组元素都是对象的数组。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.10BCCB3.11-3.15BAABA3.16-3.17BBWORD格式.分享精品.资料3.1810,2030,4850,6870,8090,1611,1203.19Constructing10100Destructing3.203objectsinexistence4objectsinexistenceafterallocation3objectsinexistenceafterdeletion3.21Countingat0Countingat93.22WORD格式.分享精品.资料Defaultconstructorcalled.Defaultconstructorcalled.Defaultconstructorcalled.Construcotor:a=1,b=2Construcotor:a=3,b=4Construcotor:a=5,b=63.23Con.Copycon.default.Copycon.3.24A=5B=14A=9B=143.255,722.253.26WORD格式.分享精品.资料ConstructingConstructingA=5B=15A=10B=15DestructingDestructing3.27voidpintStu();函数只有声明,没有定义。age是私有成员,不能用对象直接调用。3.28voidprintStu()和voidsetSno(ints)没有加限定符Student::voidsetAge(inta)在类中没有声明3.29构造函数不能定义为私有。否则无法创建对象。3.30下面是一个计算器类的定义,请完成该类成员函数的实现。classcounter{WORD格式.分享精品.资料public:counter(intnumber);voidincr