版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第26页/共NUMPAGES\*ARABIC26页江南大学网络教育第二阶段练习题答案,答案在最后一页。考试科目:《面向对象的程序设计》第章至第章(总分100分)__________学习中心(教学点)批次:层次:专业:学号:身份证号:姓名:得分:一单选题(共7题,总分值7分,下列选项中有且仅有一个选项符合题目要求,请在答题卡上正确填涂。)1.多重继承是()(1分)A.多个单继承的叠加B.派生类有多个直接基类C.多个派生类有唯一的基类D.每个派生类最多只有一个直接基类,但它可以有多个间接基类2.C++语言建立类族是通过()。(1分)A.类的嵌套B.类的继承C.虚函数D.抽象类3.派生类的对象对它的基类成员中()是可以访问的。(1分)A.公有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.私有继承的公有成员类4.下列运算符中,不能被重载的是()(1分)A.[]B..C.()D./5.用关键字()标记的函数被称为虚函数。(1分)A.virtualB.privateC.publicD.protected6.下列运算符中,不能用友元函数重载的是()(1分)A.=B.>C.<D.<>7.若一个类中含有纯虚函数,则该类称为()(1分)A.基类B.虚基类C.抽象类D.派生类二多选题(共4题,总分值8分,下列选项中至少有2个或2个以上选项符合题目要求,请在答题卡上正确填涂。)8.作用域运算符通常用来()。(2分)A.指定特定的类B.指明从哪一个基类中导出来的C.在某些成员函数中限定静态变量的可视范围D.解决二义性9.继承的优点是()。(2分)A.扩大类的使用范围,更便于使用类库B.避免重写程序代码,提供有用的概念框架C.把类组织成有条理的转化层次结构D.通用继承的自然选择和重写使类进一步拓展10.下列函数中,可以作为虚函数的是()。(2分)A.普通函数B.非静态成员函数C.构造函数D.析构函数11.下面描述中,()是正确的。(2分)A.虚函数是没有实现的函数B.纯虚函数的实现是在派生类中定义C.抽象类是只有纯虚函数的类D.抽象类指针可以指向不同的派生类三判断题(共7题,总分值7分正确的填涂“A”,错误的填涂“B”。)12.在派生过程中,派生类吸收包括构造函数和析构函数在内的所有基类成员。(1分)(
)13.抽象类中只能有一个纯虚函数。(1分)(
)14.增加一个基类的派生类,需要对基类进行根本改变。(1分)(
)15.下标运算符的重载提供了在C++中实现安全的数组下标的一种方法。(1分)(
)16.在构造函数和析构函数中调用虚函数时采用动态联编,即它们所调用的虚函数是在派生类中重定义的虚函数。(1分)(
)17.程序中可以说明抽象类的指针或引用。(1分)(
)18.重载后缀“++”运算符时多给出的一个int参数,在函数体中并不被使用。(1分)(
)四填空题(共11题,总分值22分)19.纯虚函数的定义是在虚函数定义的基础上,再让函数等于_________________。(2分)20.如果类A继承了类B,那么类A被称为_________________类,而类B又被称为_________________类。(2分)21.重载函数在编译时表现出多态性是_________________联编;而虚函数则在运行时表现出多态性是_________________联编。(2分)22.在默认情况下的继承方式为_________________。(2分)23.C++的两种联编方式为:_________________联编和_________________联编。(2分)24.运算符的重载实际上是_________________的重载。(2分)25.引进虚基类的目的是_________________。(2分)26.成员函数重载运算符需要的参数的个数总比它的操作数_________________一个。(2分)27.重载“[]”函数必须且只能带_________________个形参,且规定其参数的类型为_________________赋值操作。(2分)28.使用虚函数保证了在通过一个基类类型的指针(含引用)调用一个虚函数时,C++系统对该调用进行_________________,但是,在通过一个对象访问一个虚函数时,使用_________________(2分)29.C++提供了_________________机制,允许一个派生类可以继承多个基类,甚至这些基类是互不相关的。(2分)五简答题(共7题,总分值29分)30.重载前缀“++”运算符与重载后缀“++”运算符在形式上有什么不同?(4分)31.什么叫做抽象类?抽象类有何作用?抽象类的派生类是否一定要给出纯虚函数的实现?(4分)32.比较两种运算符重载形式。(4分)33.在面向对象技术中,类与类之间的关系如何表示?(4分)34.简述在3种继承方式下基类成员的访问权限。(4分)35.简述派生类构造函数的规则。(4分)36.什么叫做多态性?在C++中是如何实现多态的?(5分)六综合题(共5题,总分值27分)37.在第(1)题的基础上,用重载关系符“==”判断两个分数是否相等。(5分)38.#include<iostream>usingnamespacestd;classA{public:A(inti,intj){a=i;b=j}//基类构造函数voidmove(intx,inty){a+=x;b+=y;}voiddisp(){cout<<"("<<a<<","<<b<<")"<<endl;}private:inta,b;};classB:publicA{public:B(inti,intj,intk,intl):A(i,j),x(k),y(l){}//派生类构造函数voiddisp(){cout<<x<<","<<y<<endl;}voidfun1(){move(13,15);}voidfun2(){A::disp();}//语句8private:intx,y;};intmain(){Aaa(11,12);//语句1aa.disp();//语句2Bbb(13,14,15,16);//语句3bb.fun1();//语句4bb.A::disp();//语句5bb.B::disp();//语句6bb.fun2();//语句7return0;//语句8}(5分)39.使用虚函数编写程序求球体和圆柱体的体积及表面积。由于球体和圆柱体都可以看做由圆继承而来,所以可以定义圆类Circle作为基类。在Circle类中定义一个数据成员radius和两个虚函数area()和volume()。由Circle类派生Sphere类和Column类。在派生类中对虚函数area()和
volume()重新定义,分别求球体和圆柱体的体积及表面积。(6分)40.定义一个点类(Point)、矩形类(Rectangle)和立方体类(Cube)的层次结构。矩形包括长度和宽度两个新数据成员,矩形的位置从点类继承。立方体类由长度、宽度和高度构成。要求各类提供支持初始化的构造函数和显示自己成员的成员函数。编写主函数,测试这个层次结构,输出立方体类的相关信息。(6分)41.(1)在C++中,分数不是预先定义的,需要建立一个分数类,使之具有下述功能:能防止分母为0,当分数不是最简形式时进行约分以及避免分母为负数。用重载运算符完成加法、减法、乘法以及除法等四则运算。(5分)
一单选题(共7题,总分值7分,下列选项中有且仅有一个选项符合题目要求,请在答题卡上正确填涂。)1.参考答案为:B解析过程:2.参考答案为:B解析过程:继承就是创建一个具有别的类的属性和行为的新类的能力。派生类同样能作为其他类的基类,这就产生了类的层次性。3.参考答案为:A解析过程:公有继承的公有成员在派生类中仍是公有的,所以派生类的对象可以访问它;而公有继承的私有成员和保护成员以及私有继承的公有成员在派生类中已分别变为不可访问、保护的和私有的,所以派生类的对象不可以访问它们。4.参考答案为:B解析过程:不能重载“.”、“.*”、“::”和“?:”等运算符。5.参考答案为:A解析过程:6.参考答案为:A解析过程:为保持与C++中规定的赋值语义相一致,赋值运算符不能重载为友元函数7.参考答案为:C解析过程:二多选题(共4题,总分值8分,下列选项中至少有2个或2个以上选项符合题目要求,请在答题卡上正确填涂。)8.参考答案为:A,D解析过程:9.参考答案为:A,B,C解析过程:10.参考答案为:B,D解析过程:11.参考答案为:B,D解析过程:被关键字virtual说明的成员函数为虚函数。它有函数实现,即使函数体可能为空。只要一个类中含有纯虚函数,该类即为抽象类。根据赋值兼容规则,抽象类指针可以指向不同的派生类。三判断题(共7题,总分值7分正确的填涂“A”,错误的填涂“B”。)12.参考答案为:F解析过程:在派生类的生成过程中,派生类吸收基类的大部分成员,但不吸收基类的构造函数(包括拷贝构造函数)和析构函数等。13.参考答案为:F解析过程:抽象类可有一个或多个纯虚函数。14.参考答案为:F解析过程:当从现存类中派生出新类时,可以对派生类做适当变化,但不需要对基类进行根本改变,否则违背继承的实质。15.参考答案为:T解析过程:16.参考答案为:F解析过程:在构造函数和析构函数中调用虚函数时采用静态联编,即它们所调用的虚函数是自己的类中定义的函数,如果在自己的类中没有实现这个虚函数,则调用的是基类中虚函数,但绝不是任何在派生类中重定义的虚函数。17.参考答案为:T解析过程:18.参考答案为:T解析过程:重载后“++”运算符多给出一个的int参数,只是表明调用该函数时运算符“++”应放在操作数的后面。四填空题(共11题,总分值22分)19.参考答案为:0解析过程:20.参考答案为:派生,基解析过程:21.参考答案为:静态,动态解析过程:22.参考答案为:私有继承方式解析过程:23.参考答案为:静态,动态解析过程:24.参考答案为:函数解析过程:25.参考答案为:解决二义性解析过程:26.参考答案为:少解析过程:27.参考答案为:1,整型解析过程:28.参考答案为:动态联编,静态联编解析过程:根据动态联编的条件进行分析。29.参考答案为:多继承解析过程:五简答题(共7题,总分值29分)30.参考答案为:增量运算符“++”既可以按成员函数方式重载也可以按友元函数方式重载,而且既可被重载为前缀运算符,也可被重载为后缀运算符。其中后缀运算符函数多给出一个int型参数,表明调用该函数时运算符“++”应放在操作数的后面,且并不在函数体中使用该参数本身,因此没有必要给出该参数的名字①用成员函数形式重载运算符++。以成员函数方式重载前缀“++”运算符的函数原型的一般格式如下<类型><类名>::operator++();以类成员方式重载后“++”运算符的函数原型的一般格式如下:<类型><类名>::operator+(int);②用友元函数形式重载运算符++如果要用友元函数重载增量++,必须把操作数作为引用参数传递。以友元函数方式重载前缀“++”运算符的函数原型一般格式如下:<类型>operator++(<类名>&);以友元方式重载后缀“++”运算符的函数原型一般格式如下:<类型>operator++(<类名>&,int)解析过程:31.参考答案为:包含有纯虚函数的类称为抽象类。抽象类用来描述一组子类的共同的操作接口,它用作基类,而接口的实现由派生类提供。抽象类的派生类不一定要给出纯虚函数的实现。如果没有在派生类中给出纯虚函数的实现,则需将它说明为纯虚函数,否则编译器将给出错误信息。说明了纯虚函数的派生类仍是抽象类。解析过程:32.参考答案为:在许多情况下,用友元还是成员函数重载运算符在功能上没有什么区别。有时将二元运算符重载为友元函数比重载为一个成员函数使用起来更灵活。例如:c=34.5+c2;如果“+”用成员函数重载,编译时会出错。因为该语句右边的表达式被解释为:34.5.operator+(c2);由于34.5是float型数据,不能进行“.”操作解决这个问题的办法就是用友元函数而不是成员函数重载加法。这时,该语句右边的表达式被解释为operator+(34.5,c2);两个变元都被显式传给运算符函数。当然,重载为友元函数也有一些限制。第一,为保持与C++中规定的赋值语义相一致,虽然赋值运算符是个二元操作符,但不能重载为友元函数。同样,也应将+=、-=等这些赋值运算符重载为成员函数。第二,友元函数也不能重载()、[]、和->运算符。第三,在重载增量或减量运算符时,若使用友元函数,则需要应用引用参数。解析过程:33.参考答案为:面向对象技术中,类是数据和操作的集合,它们之间有3种主要关系:Has-A、Uses-A和Is-A。Has-A表示类的包含关系,用以描述一个类由多个“部件类”构成。在面向对象技术中,实现Has-A关系用类成员表示。Uses-A表示一个类部分地使用另一个类。在面向对象技术中,这种关系通过类之间成员函数的相互联系或对象参数传递实现。另外,通过定义友元也能实现这种关系。Is-A表示一种分类方式,描述类的抽象和层次关系。继承可以表达Is-A关系。解析过程:34.参考答案为:◆当类的继承方式为公有继承时,在派生类中,基类的公有成员和保护成员被继承后分别作为派生类的公有成员和保护成员,这样使得派生类的成员函数可以直接访问它们,而派生类成员函数无法直接访问基类的私有成员。在类外部,派生类的对象可以访问继承下来的基类公有成员。◆当类的继承方式为私有继承时,在派生类中,基类的公有成员和保护成员作为派生类的私有成员,派生类的成员函数可以直接访问它们,而派生类的成员函数无法直接访问基类的私有成员。在类外部,派生类的对象无法访问基类的所有成员。◆当类的继承方式为保护继承时,在派生类中,基类的公有成员和保护成员作为派生类的保护成员,派生类的成员函数可以直接访问它们,而派生类的成员函数无法直接访问基类的私有成员。在类外部,派生类的对象无法访问基类的所有成员。解析过程:35.参考答案为:◆若派生类有构造函数而基类没有,当创建派生类的对象时,派生类相应的构造函数被自动调用。◆若派生类没有构造函数而基类有,则基类必须拥有默认构造函数。只有这样,当创建派生类的对象时,才能自动执行基类的默认构造函数。◆若派生类有构造函数,且基类有默认构造函数,则创建派生类的对象时,基类的默认构造函数会自动执行,除非当前被调用的派生类构造函数在其初始化段中显式地调用了基类的有参构造函数。◆若派生类和基类都有构造函数,但基类没有默认构造函数时,则派生类的每一个构造函数必须在其初始化列表中显式地调用基类的某个构造函数。只有这样,当创建派生类的对象时,基类的构造函数才能获得执行机会。解析过程:36.参考答案为:多态性就是同一符号或名字在不同情况下具有不同解释的现象,即是指同一个函数的多种形态。C++支持两种多态性,编译时的多态性和运行时的多态性。多态性有两种表现形式:一种是不同的对象在收到相同的消息时产生不同的动作,这主要通过虚函数来实现;另一种是同一对象收到相同的消息却产生不同的函数调用,这主要通过函数重载来实现。解析过程:六综合题(共5题,总分值27分)37.参考答案为:①在类体中增加运算符“==”的声明。friendbooloperator==(Fraction&num1,Fraction&num2);//重载运算符"=="②在类体外增加运算符“==”的实现booloperator==(Fraction&numl,Fraction&num2);{if(num1.munerator==num2.numerator&&num1.denominator==num2.denominatorreturntrue;elsereturnfalse;}③在主函数中增加对运算符“==”的测试语句。if(r1==r2)cout<<"r1isequaltor2"<<endl;elsecout<<"r1isn'tequaltor2"<<endl;if(r1==r8)cout<<"r1isequaltor8"<endl;elsecout<<"r1isn'tequaltor8"endl;【输出结果】新增输出结果为:r1isn’tequaltor2r1isequaltor8解析过程:在上题的基础上,按重载运算符的规则重载运算符“==”。38.参考答案为:【输出结果】(11,12)(26,29)15,16(26,29)解析过程:①程序执行语句1,调用基类构造函数,使得aa.a和aa.b的值分别为11和12,执行语句2时,输出第1行结果。②程序执行语句3时,首先调用基类构造函数,初始化成员列表,然后调用派生类构造函数,使得b.a、bb.b、bb.x和bb.y的值分别为13、14、15和16。③程序执行语句4时,使得bb.a和bb.b的值分别为26和29。④程序执行语句5和语句6时,分别调用基类和派生类中的disp(),输出第2行和第3行结果。⑤程序执行语句7时,输出第4行结果。注意:由于支配性规则,语句5和语句8必须用类名加作用域运算符进行限定,否则结果是不一样的,读者可以自己上机试一试。39.参考答案为://xt5_1.cpp#include<iostream>usingnamespacestd;constdoublePI=3.14;classCircle{public:Circle(doubler){radius=r;}virtualdoublearea(){return0.0;}virtualdoublevolume(){return0.0;}protected:doubleradius;};ClassSphere:publicCircle{public:Sphere(doubler):Circle(r){}doublearea(){return4.0*PI*radius*radius;}doublevolume(){return4.0*PI*radius*radius*radius/3.0;}}ClassColumn:publicCircle{public:Column(doubler,doubleh):Circle(r){height=h;}doublearea(){return2.0*PI*radius*(height+radius);}doublevolume(){returnPI*raius*radius*height;}private:doubleheight;};intmain(){Circle*p;Spheresobj(1);p=&sobj;cout<<"球体:"<<endl;cout<<"体积="<<p->volume()<<endl;cout<<"表面积="<<p->area()<<endl;Columncobj(2,4);p=&cobj;cout<<"圆柱体:"<<endl;cout<<"体积="<<p->volume()<<endl;cout<<"表面积="<<p->area()<<endl;return0;}【输出结果】球体:体积=4.18667表面积=12.56圆柱体:体积=50.24表面积=75.36解析过程:①根据题目中给出的继承关系,运用继承知识定义各个类。②为了实现动态联编,在主函数中通过对象指针来调用虚函数area()和volume()。40.参考答案为://xt4_1.cpp#include<iostream>usingnamespacestd;classPoint{protected://定义基类intx,y;public:Point(intmyx,intmyy){x=myx;y=myy;}voiddisplayxy(){cout<<"("<<x<<","<<y<<")"<<endl;}};classRectangle:publicPoint//定义派生类,公有继承方式{private:intl,w;public:Rectangle(intmyx,intmyy,intmyl,intmyw):Point(myx,myy){1=myl;w=myw;}voiddisplaylw(){cout<<l<<","<<w;}};classCube:publicRectangle//定义派生类,公有继承方式{private:inth;public:Cube(intmyx,intmyy,intmyl,intmyw,intmyh):Rectangle(myx,myy,myl,myw){h=myh;}voiddisplayh(){cout<<h<<endl;}};intmain(){Cubev(20,40,3,5,6);//派生类对象cout<<"Thedateofcube:"<<endlcout<<"Thepostionofcube:";v.displayxy();cout<<"Thelength,widthandheightofcube:";v.displayw();cout<<",";v.displayh();return0;}【输出结果】Thedataofcube:Thepostionofcube:(20,40)Thelength,widthandheightofcube:3,5,6解析过程:①根据题目中给出的继承关系,运用继承知识定义各个类。②由于派生类要调用基类的构造函数来初始化基类成员,所以Point类的构造函数只需2个参数,而Rectangle类和Cube类的构造函数分别需要4个和5个参数。③由于各类有显示自己成员的成员函数,所以输出立方体类的信息只需通过调用基类的相关成员函数即可。41.参考答案为://xt6_1.cpp#include<math.h>#include<iostream.h>#include<stdlib.h>classFraction{public:Fraction(intx=0,inty=1);//声明带默认值的构造函数voidprint();Friendfractionoperator+(Fraction&num1,Fraction&num2);//重载“+”Friendfractionoperator-(Fraction&num1,Fraction&num2);//重载“-”Friendfractionoperator*(Fraction&num1,Fraction&num2);//重载“*”Friendfractionoperator/(Fraction&num1,Fraction&num2);//重载“/”private:intnumerator,denominator;voidoptimization();};voidFraction::optimization(){intgcd,min,max;if(denominator==0){//分母为0cout<<“Azerodenominatorisinvalid”<<endl;exit(1);}gcd=(abs(numerator)>abs(denominator)?abs(denominator):abs(numerator));if(gcd==0)return0;if(abs(numerator)>abs(denominator)){max=numerator;min=denominator;}else{max=numerator;min=denominator;}do{gcd=max%min;max=min;min=gcd;}while(gcd!=0);numerator/=max;denominator=max;if(denominator<0){numerator=-numerator;denominator=-denomiator;}}Fraction::Fraction(intx,inty){numerator=x;denominator=y;optimization();}voidFraction:print(){if(denominator==1)//整数形式cout<<numerator<<endl.;elseif(numerator==0)//数值为零cout<<numerator<;elsecout<<numerator<<"/"<<denominator<<endl;}Fractionoperator+(Fraction&numl,Fraction&num2){Fractiontemp;//分母为两个给出的分数的分母乘积//分子为第一个数的分子乘以第二个数的分母加上第一个数的分母乘以第二个数的分子temp.denominator=num1.denominator*num2.denominator:temp.numerator=numl.numerator*num2.denominator+numl.denominator*num2.numerator;temp.optimization();returntemp:}Fractionoperator-(Fraction&num1,Fraction&num2){Fractiontemp://分母为两个给出的分数的分母乘积//分子为第一个数的分子乘以第二个数的分母减去第一个分的分母乘以第二个数的分子temp.denominator=num1.denominator*num2.denominator;temp.numerator=num1.numerator*num2.denominator-num1.denominator*num2.numerator;temp.optimization();returntemp;}Fractionoperator*(Fraction&num1,Fraction&num2){Fractiontemp;//分母为两个给出的分数的分母乘积//分子为两个给出的分数的分子乘积tempdenominator=num1.denominator*num2.denominatortempnumerator=num1.numerator*num2.numerator;temp.optimization();returntemp;}Fractionoperator/(Fraction&num1,Fraction&num2){Fractiontemp;//分母为第一个分数的分母乘以第二个分数的的分子//分子为第一个分数的分子乘以第二个分数的的分母tempdenominator=num1.denominator*num2.numeratortempnumera
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年护士资格证测试卷及答案详解
- 2026年安全培训考试题及答案解析
- 总经理述职报告范文
- 智慧城市项目组织机构及管理措施
- 工程量清单及计算规则
- 下半学期高三班主任工作计划
- 垃圾场防渗工程施工方案
- 标线工程施工方案
- 高性能金属铝材:制备工艺、微观结构与性能的深度解析
- 高强轻集料混凝土的配制技术与性能特征研究
- GB/T 47661-2026温室气体产品碳足迹量化方法与要求风力发电
- 2026贵州农商联合银行第二批社会招聘11人笔试参考题库及答案详解
- 2026年通信安全员(ABC证)考试题库(含答案)
- 2026世界无烟日:揭开烟草成瘾面纱
- 修订一单一库质量手册和程序文件参考文件
- 2026年新疆银行人员招聘笔试参考题库及答案详解
- 2026年小学二年级升三年级数学暑假衔接作业(纯作业打印版)
- 2026年专业技术人员继续教育公需科目人工智能及应用试题及答案
- 储能电站消防设施定期维保方案
- 江苏徐州市交通控股集团招聘笔试题库2026
- 2026年电大行政组织学期末考试真题及答案
评论
0/150
提交评论