面向对象的程序设计第二阶段练习.docx
- 文档编号:5631336
- 上传时间:2022-12-29
- 格式:DOCX
- 页数:17
- 大小:22.86KB
面向对象的程序设计第二阶段练习.docx
《面向对象的程序设计第二阶段练习.docx》由会员分享,可在线阅读,更多相关《面向对象的程序设计第二阶段练习.docx(17页珍藏版)》请在冰豆网上搜索。
面向对象的程序设计第二阶段练习
江南大学网络教育第二阶段练习题
考试科目:
《面向对象的程序设计》第章至第章(总分100分)
__________学习中心(教学点)批次:
层次:
专业:
学号:
身份证号:
姓名:
得分:
一单选题(共7题,总分值7分,下列选项中有且仅有一个选项符合题目要求,请在答题卡上正确填涂。
)
1.多重继承是(B)(1分)
a.多个单继承的叠加
B.派生类有多个直接基类
C.多个派生类有唯一的基类
D.每个派生类最多只有一个直接基类,但它可以有多个间接基类
2.C++语言建立类族是通过(B)。
(1分)
a.类的嵌套
B.类的继承
C.虚函数
D.抽象类
3.派生类的对象对它的基类成员中(a)是可以访问的。
(1分)
a.公有继承的公有成员
B.公有继承的私有成员
C.公有继承的保护成员
D.私有继承的公有成员类
4.下列运算符中,不能被重载的是(B)(1分)
a.[]
B..
C.()
D./
5.用关键字(a)标记的函数被称为虚函数。
(1分)
a.virtual
B.private
C.public
D.protected
6.下列运算符中,不能用友元函数重载的是(a)(1分)
a.=
B.>
C.<
D.<>
7.若一个类中含有纯虚函数,则该类称为(C)(1分)
a.基类
B.虚基类
C.抽象类
D.派生类
二多选题(共4题,总分值8分,下列选项中至少有2个或2个以上选项符合题目要求,请在答题卡上正确填涂。
)
8.作用域运算符通常用来(aD)。
(2分)
a.指定特定的类
B.指明从哪一个基类中导出来的
C.在某些成员函数中限定静态变量的可视范围
D.解决二义性
9.继承的优点是(aBC)。
(2分)
a.扩大类的使用范围,更便于使用类库
B.避免重写程序代码,提供有用的概念框架
C.把类组织成有条理的转化层次结构
D.通用继承的自然选择和重写使类进一步拓展
10.下列函数中,可以作为虚函数的是(BD)。
(2分)
a.普通函数
B.非静态成员函数
C.构造函数
D.析构函数
11.下面描述中,(BD)是正确的。
(2分)
a.虚函数是没有实现的函数
B.纯虚函数的实现是在派生类中定义
C.抽象类是只有纯虚函数的类
D.抽象类指针可以指向不同的派生类
三判断题(共7题,总分值7分正确的填涂“a”,错误的填涂“B”。
)
12.在派生过程中,派生类吸收包括构造函数和析构函数在内的所有基类成员。
(1分)( B )
13.抽象类中只能有一个纯虚函数。
(1分)( B)
14.增加一个基类的派生类,需要对基类进行根本改变。
(1分)( B )
15.下标运算符的重载提供了在C++中实现安全的数组下标的一种方法。
(1分)(a )
16.在构造函数和析构函数中调用虚函数时采用动态联编,即它们所调用的虚函数是在派生类中重定义的虚函数。
(1分)( B )
17.程序中可以说明抽象类的指针或引用。
(1分)(a )
18.重载后缀“++”运算符时多给出的一个int参数,在函数体中并不被使用。
(1分)(a )
四填空题(共11题,总分值22分)
19.纯虚函数的定义是在虚函数定义的基础上,再让函数等于_____0____________。
(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分)
增量运算符“++”既可以按成员函数方式重载也可以按友元函数方式重载,而且既可被重载为前缀运算符,也可被重载为后缀运算符。
其中后缀运算符函数多给出一个int型参数,表明调用该函数时运算符“++”应放在操作数的后面,且并不在函数体中使用该参数本身,因此没有必要给出该参数的名字
①用成员函数形式重载运算符++。
以成员函数方式重载前缀“++”运算符的函数原型的一般格式如下
<类型><类名>:
:
operator++();
以类成员方式重载后“++”运算符的函数原型的一般格式如下:
<类型><类名>:
:
operator+(int);
②用友元函数形式重载运算符++
如果要用友元函数重载增量++,必须把操作数作为引用参数传递。
以友元函数方式重载前缀“++”运算符的函数原型一般格式如下:
<类型>operator++(<类名>&);
以友元方式重载后缀“++”运算符的函数原型一般格式如下:
<类型>operator++(<类名>&,int)
31.什么叫做抽象类?
抽象类有何作用?
抽象类的派生类是否一定要给出纯虚函数的实现?
(4分)
包含有纯虚函数的类称为抽象类。
抽象类用来描述一组子类的共同的操作接口,它用作基类,而接口的实现由派生类提供。
抽象类的派生类不一定要给出纯虚函数的实现。
如果没有在派生类中给出纯虚函数的实现,则需将它说明为纯虚函数,否则编译器将给出错误信息。
说明了纯虚函数的派生类仍是抽象类。
32.比较两种运算符重载形式。
(4分)
在许多情况下,用友元还是成员函数重载运算符在功能上没有什么区别。
有时将二元运算符重载为友元函数比重载为一个成员函数使用起来更灵活。
例如:
c=34.5+c2;
如果“+”用成员函数重载,编译时会出错。
因为该语句右边的表达式被解释为:
34.5.operator+(c2);
由于34.5是float型数据,不能进行“.”操作解决这个问题的办法就是用友元函数而不是成员函数重载加法。
这时,该语句右边的表达式被解释为
operator+(34.5,c2);
两个变元都被显式传给运算符函数。
当然,重载为友元函数也有一些限制。
第一,为保持与C++中规定的赋值语义相一致,虽然赋值运算符是个二元操作符,但不能重载为友元函数。
同样,也应将+=、-=等这些赋值运算符重载为成员函数。
第二,友元函数也不能重载()、[]、和->运算符。
第三,在重载增量或减量运算符时,若使用友元函数,则需要应用引用参数
33.在面向对象技术中,类与类之间的关系如何表示?
(4分)
面向对象技术中,类是数据和操作的集合,它们之间有3种主要关系:
Has-a、Uses-a和Is-a。
Has-a表示类的包含关系,用以描述一个类由多个“部件类”构成。
在面向对象技术中,实现Has-a关系用类成员表示。
Uses-a表示一个类部分地使用另一个类。
在面向对象技术中,这种关系通过类之间成员函数的相互联系或对象参数传递实现。
另外,通过定义友元也能实现这种关系。
Is-a表示一种分类方式,描述类的抽象和层次关系。
继承可以表达Is-a关系。
34.简述在3种继承方式下基类成员的访问权限。
(4分)
当类的继承方式为公有继承时,在派生类中,基类的公有成员和保护成员被继承后分别作为派生类的公有成员和保护成员,这样使得派生类的成员函数可以直接访问它们,而派生类成员函数无法直接访问基类的私有成员。
在类外部,派生类的对象可以访问继承下来的基类公有成员。
◆当类的继承方式为私有继承时,在派生类中,基类的公有成员和保护成员作为派生类的私有成员,派生类的成员函数可以直接访问它们,而派生类的成员函数无法直接访问基类的私有成员。
在类外部,派生类的对象无法访问基类的所有成员。
◆当类的继承方式为保护继承时,在派生类中,基类的公有成员和保护成员作为派生类的保护成员,派生类的成员函数可以直接访问它们,而派生类的成员函数无法直接访问基类的私有成员。
在类外部,派生类的对象无法访问基类的所有成员。
35.简述派生类构造函数的规则。
(4分)
◆若派生类有构造函数而基类没有,当创建派生类的对象时,派生类相应的构造函数被自动调用。
◆若派生类没有构造函数而基类有,则基类必须拥有默认构造函数。
只有这样,当创建派生类的对象时,才能自动执行基类的默认构造函数。
◆若派生类有构造函数,且基类有默认构造函数,则创建派生类的对象时,基类的默认构造函数会自动执行,除非当前被调用的派生类构造函数在其初始化段中显式地调用了基类的有参构造函数。
◆若派生类和基类都有构造函数,但基类没有默认构造函数时,则派生类的每一个构造函数必须在其初始化列表中显式地调用基类的某个构造函数。
只有这样,当创建派生类的对象时,基类的构造函数才能获得执行机会。
36.什么叫做多态性?
在C++中是如何实现多态的?
(5分)
多态性就是同一符号或名字在不同情况下具有不同解释的现象,即是指同一个函数的多种形态。
C++支持两种多态性,编译时的多态性和运行时的多态性。
多态性有两种表现形式:
一种是不同的对象在收到相同的消息时产生不同的动作,这主要通过虚函数来实现;另一种是同一对象收到相同的消息却产生不同的函数调用,这主要通过函数重载来实现。
六综合题(共5题,总分值27分)
37.在第
(1)题的基础上,用重载关系符“==”判断两个分数是否相等。
(5分)
①在类体中增加运算符“==”的声明。
friendbooloperator==(Fraction&num1,Fraction&num2);//重载运算符"=="
②在类体外增加运算符“==”的实现
booloperator==(Fraction&numl,Fraction&num2);
{
if(num1.munerator==num2.numerator&&num1.denominator==num2.denominator
returntrue;
else
returnfalse;
}
③在主函数中增加对运算符“==”的测试语句。
if(r1==r2)
cout<<"r1isequaltor2"<<endl;
else
cout<<"r1isn'tequaltor2"<<endl;
if(r1==r8)
cout<<"r1isequaltor8"<endl;
else
cout<<"r1isn'tequaltor8"endl;
【输出结果】
新增输出结果为:
r1isn’tequaltor2
r1isequaltor8
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();}//语句8
private:
intx,y;
};
intmain()
{
aaa(11,12);//语句1
aa.disp();//语句2
Bbb(13,14,15,16);//语句3
bb.fun1();//语句4
bb.a:
:
disp();//语句5
bb.B:
:
disp();//语句6
bb.fun2();//语句7
return0;//语句8
}(5分)
【输出结果】
(11,12)
(26,29)
15,16
(26,29)
39.使用虚函数编写程序求球体和圆柱体的体积及表面积。
由于球体和圆柱体都可以看做由圆继承而来,所以可以定义圆类Circle作为基类。
在Circle类中定义一个数据成员radius和两个虚函数area()和volume()。
由Circle类派生Sphere类和Column类。
在派生类中对虚函数area()和 volume()重新定义,分别求球体和圆柱体的体积及表面积。
(6分)
//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
40.定义一个点类(Point)、矩形类(Rectangle)和立方体类(Cube)的层次结构。
矩形包括长度和宽度两个新数据成员,矩形的位置从点类继承。
立方体类由长度、宽度和高度构成。
要求各类提供支持初始化的构造函数和显示自己成员的成员函数。
编写主函数,测试这个层次结构,输出立方体类的相关信息。
(6分)
:
//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:
"<<endl
cout<<"Thepostionofcube:
";
v.displayxy();
cout<<"Thelength,widthandheightofcube:
";
v.displayw();
cout<<",";
v.displayh();
return0;
}
【输出结果】
Thedataofcube:
Thepostionofcube:
(20,40)
Thelength,widthandheightofcube:
3,5,6
41.
(1)在C++中,分数不是预先定义的,需要建立一个分数类,使之具有下述功能:
能防止分母为0,当分数不是最简形式时进行约分以及避免分母为负数。
用重载运算符完成加法、减法、乘法以及除法等四则运算。
(5分)
//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)
{//分母为0
cout<<“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<;
else
cout<<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,Frac
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 第二阶段 练习