面向对象程序设计试题一.docx
《面向对象程序设计试题一.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计试题一.docx(19页珍藏版)》请在冰豆网上搜索。
![面向对象程序设计试题一.docx](https://file1.bdocx.com/fileroot1/2023-8/4/38a9785b-d049-43cc-951d-42085c8ed016/38a9785b-d049-43cc-951d-42085c8ed0161.gif)
面向对象程序设计试题一
一、单项选择题(本大题共10小题,每小题2分,共20分)
在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。
错选、多选或未选均无分。
1.一个函数功能不太复杂,但要求被频繁调用,选用()
A.内联函数B.重载函数
C.递归函数D.嵌套函数
2.C++的继承性允许派生类继承基类的()
A.部分特性,并允许增加新的特性或重定义基类的特性
B.部分特性,但不允许增加新的特性或重定义基类的特性
C.所有特性,并允许增加新的特性或重定义基类的特性
D.所有特性,但不允许增加新的特性或重定义基类的特性
3.在C++中,封装是借助什么达到的?
()
A.结构B.类
C.数组D.函数
4.建立包含有类对象成员的派生类对象时,自动调用构造函数的执行顺序依次为()
A.自己所属类、对象成员所属类、基类的构造函数
B.对象成员所属类、基类、自己所属类的构造函数
C.基类、对象成员所属类、自己所属类的构造函数
D.基类、自己所属类、对象成员所属类的构造函数
5.类的析构函数是对一个对象进行以下哪种操作时自动调用的?
()
A.建立B.撤消
C.赋值D.引用
不是描述类的成员函数的是()
A.构造函数B.析构函数
C.友元函数D.拷贝构造函数
7.所有在函数中定义的变量,连同形式参数,都属于()
A.全局变量B.局部变量
C.静态变量D.寄存器变量
8.假定AB为一个类,则执行ABx;语句时将自动调用该类的()
A.有参构造函数B.无参构造函数
C.拷贝构造函数D.赋值构造函数
9.假定AA为一个类,a()为该类公有的函数成员,x为该类的一个对象,则访问x对象中函数成员a()的格式为()
A.x.aB.x.a()
C.x->aD.x->a()
10.对于任一个类,用户所能定义的构造函数的个数至多为()
A.0B.1
C.2D.任意个
二、填空题(本大题共10小题,每小题2分,共20分)
请在每小题的空格中填上正确答案。
错填、不填均无分。
11.对象的四大基本特性是多态性、继承性、______和封装性。
12.为了使类中的成员不能被类外的函数通过成员操作符访问,则应把该成员的访问权限定义为______。
13.C++程序的源文件扩展名为______。
14.所有模版都是以______关键字和一个形参表开头的。
15.在#include命令中所包含的头文件,可以是系统定义的头文件,也可以是______定义的头文件。
16.一个const对象只能访问______成员函数。
17.C++是通过引用运算符______来定义一个引用的。
18.若y是x的引用,则对y的操作就是对______的操作。
19.执行______操作将释放由p所指向的动态分配的数据空间。
20.C++的流库预定义了4个流,它们是cin、cout、______和clog。
三、改错题(本大题共2小题,每小题6分,共12分)
21.假定下面程序将分数a和b相加,其和赋值给c并输出,要求输出结果为“13/18”,其主函数5到8行之间存在着三行语句错误,请指出错误行的行号并改正。
#include
classFranction{//定义分数类
intnume;//定义分子
intdeno;//定义分母
public:
//把*this化简为最简分数,具体定义在另外文件中实现
voidFranSimp();
//返回两个分数*this和x之和,具体定义在另外文件中实现
FranctionFranAdd(constFranction&x);
//置分数的分子和分母分别0和1
voidInitFranction(){nume=0;deno=1;}
//置分数的分子和分母分别n和d
voidInitFranction(intn,intd){nume=n;deno=d;}
//输出一个分数
voidFranOutput(){cout<};
voidmain()//1行
{//2行
Franctiona,b,c;//3行
a.InitFranction(7,18);//4行
b.InitFranction
(1);//5行
c.InitFranction();//6行
c=FranAdd(a,b);//7行
cout<}//9行
错误行的行号为______、______和______。
分别改正为______、______和______。
22.下面是一个类的定义,在5到12行之间有3行存在语法错误,请指出错误行的行号并改正。
classCE{//1行
private:
//2行
inta,b;//3行
intgetmin(){return(a
a:
b);}//4行
public//5行
intc;//6行
voidSetValue(intx1,intx2,intx3){//7行
a=x1;b=x2;c=x3;//8行
};//9行
intGetMin();//10行
};//11行
intGetMin(){//12行
intd=getmin();//13行
return(dd:
c);//14行
}//15行
错误行的行号为______、______和______。
分别改正为______、______和______。
四、程序填空题(本大题共3小题,每小题6分,共18分)
请按提示要求完成以下程序段的填空。
23.classA{
inta,b;
public:
____
(1)____//定义构造函数,使参数aa和bb的默认值为0,
//在函数体中用aa初始化a,用bb初始化b
};
main(){
A*p1,*p2;
____
(2)____;//调用无参构造函数生成由p1指向的动态对象
____(3)____;//调用带参构造函数生成由p2指向的动态对象,
//使a和b成员分别被初始化为4和5
}
(1)
(2)(3)
24.一种类定义如下:
#include
#include
classBooks
{
private:
charbk_name[20];//书的名称
intprice;//书的价格
staticinttotalprice;//同类书总价格
public:
Books(char*str,intp){//构造函数
strcpy(bk_name,str);//strcpy函数将str字符串的内容拷贝到bk_name
price=p;
totalprice+=price;
}
~Books(){totalprice-=price;}
char*GetN(){____(4)____;}//返回书名称
intGetP(){returnprice;}
____(5)____GetTotal_Price(){//定义静态成员函数
____(6)____;//返回总价格
}
};
(4)(5)(6)
25.已知一个类的定义如下:
#include
classAA{
inta[10];
intn;
public:
voidSetA(intaa[],intnn);//用数组aa初始化数据成员a,
//用nn初始化数据成员n
intMaxA();//从数组a中前n个元素中查找最大值
voidSortA();//采用选择排序的方法对数组a中前n个元素
//进行从小到大排序
voidInsertA();//采用插入排序的方法对数组a中前n个元素进行从小到大排序
voidPrintA();//依次输出数组a中的前n个元素
};
voidAA:
:
SortA()
{
inti,j;
for(i=0;____(7)____;i++){
intx=a[i],k=i;
for(j=i+1;jif(a[j]x=a[j];
k=____(8)____;
}
a[k]=a[i];
a[i]=____(9)____;
}
}
(7)(8)(9)
五、程序分析题(本大题共6小题,每小题5分,共30分)
阅读以下程序,写出其运行结果。
26.#include
constintN=6;
voidfun();
voidmain()
{
for(inti=1;ifun();
}
voidfun()
{
staticinta=2;
cout<<(a+=3)<<′′;
}
27.#include
#include
classfun{
friendostream&operator<<(ostream&,fun);
}ff;
ostream&operator<<(ostream&os,funf){
os.setf(ios:
:
left);
returnos;
}
voidmain()
{
cout<cout<}
28.#include
classa
{
public:
virtualvoidfunc(){cout<<"funcinclassa"<};
classb
{
public:
virtualvoidfunc(){cout<<"funcinclassb"<};
classc:
publica,publicb
{
public:
voidfunc(){cout<<"funcinclassc"<};
voidmain()
{
cc;
a&pa=c;
b&pb=c;
pa.func();
pb.func();
}
29.#include
classtesta{
public:
testa(){a1=0;}
testa(inti){a1=i;}
voidprintout(){cout<private:
inta1;
};
classtestb:
publictesta{
public:
testb(){b1=0;};
testb(inti,intj,intk);
voidprintout();
private:
intb1;
testaaa;
};
testb:
:
testb(inti,intj,intk):
testa(i),aa(j){b1=k;}
voidtestb:
:
printout(){
testa:
:
printout();
cout<}
voidmain(){
testbtt[2];
tt[0]=testb(9,3,5);
tt[1]=testb(8,4,7);
for(inti=0;i<2;i++)
tt[i].printout();
}
30.#include
voidmain()
{
for(inti=-1;i<4;i++)
cout<<(i?
′0′:
′*′);
}
31.#include
classDate
{
intYear,Month,Day;
public:
voidSetDate(inty,intm,intd){Year=y;Month=m;Day=d;}
voidPrintDate(){cout<Date(){SetDate(2000,1,1);}
Date(inty,intm,intd){SetDate(y,m,d);}
};
classTime
{
intHoure,Minutes,Seconds;
public:
voidSetTime(inth,intm,ints){Houre=h;Minutes=m;Seconds=s;}
voidPrintTime(){cout<"<"<Time(){SetTime(0,0,0);}
Time(inth,intm,ints){SetTime(h,m,s);}
};
classDate_Time:
publicDate,publicTime
{
public:
Date_Time():
Date(),Time(){};
Date_Time(inty,intmo,intd,inth,intmi,ints):
Date(y,mo,d),Time(h,mi,s){}
voidPrintDate_Time(){PrintDate();PrintTime();}
};
voidmain()
{
Date_Timedt_a,dt_b(2002,10,1,6,0,0);
dt_a.PrintDate_Time();
dt_b.SetTime(23,59,59);
dt_b.PrintDate_Time();
dt_a.SetDate(2002,12,31);
dt_a.PrintDate_Time();
}
姓名
✧本试卷满分100分;
✧请将答案写在答题纸上,写明题号,不必抄题,字迹工整、清晰;
✧请在答题纸和试题纸上都写上你的班级,学号和姓名,交卷时请将试题纸、答题纸和草纸
一并交上来。
一、单选题(共10分,每题1分)
1.C++中解决命名冲突的机制是:
(A)虚基类(B)虚函数(C)函数重载(D)名字空间(namespace)
2.若类A的一个对象所占的内存空间中包含虚函数表的入口地址,则:
(A)类A不能有静态数据成员 (B)类A中公有的成员函数一定是虚的
(C)类A中至少有一个成员函数是虚的 (D)类A的析构函数一定是虚的
3.任意一个类,析构函数的个数最多是:
(A)不限个数(B)1(C)2(D)3
4.下列关于this指针的说法,哪个是正确的:
(A)this指针一定指向常量型数据(B)this指向的数据不可更改
(C)静态成员函数中也可以访问this指针(D)this指针本身可直接作为成员函数的返回值
5.在类定义中,为说明成员的访问权限,private,protected,public可以出现次数为:
(A)次数没有具体限定(B)每种至多一次
(C)public至少一次(D)每种至少一次
6.下面哪种定义方式是正确的,并且使得p可以作为函数voidf(A*constpp);的实参:
(A) A*p=newA;(B) Aa;A*p=a;
(C) constA*p=newA;(D) Aa;constA*p=a;
7.obj是类A的一个对象,执行语句constA&aA=obj;,则下列说法正确的是:
(A) 类A的拷贝构造函数会被调用(B) 类A的赋值函数会被调用
(C) &aA的值就是&obj(D)语句obj.f();等价于语句aA.f();
8.下面关于访问类A的私有数据成员的说法,错误的是:
(A) 类A的友元函数可以访问类A的私有成员。
(B) 类A的友元类中的非静态成员函数可以访问类A的私有成员。
(C) 类A的嵌套类中的非静态成员函数可以访问类A的私有成员。
(D) 类A中的非静态成员函数可以访问类A的私有成员。
9.类A中有唯一的一个成员函数f,且f是公有的静态或非静态成员函数,对于类A的一个对象a,执行语句a.f(100);成功,那么f的函数原型不可以是:
(A)A&f(int,int=50);(B)voidf(int&);
(C)constA*f(constint);(D)Af(constint&);
10.下面关于类的成员函数描述不正确的是:
(A)静态成员函数内可以直接访问类的非静态成员数据
(B)静态成员函数内可以直接访问类的静态成员数据
(C)非静态成员函数可以直接访问类的非静态成员数据
(D)非静态成员函数可以直接访问类的静态成员数据
二、判断正误,对于你认为错误的论述,说明原因或举出反例。
(每题2分,共20分)
1.重载流操作符<<和>>时,如果第一个参数的类型为ostream和istream,那么这个重载函数既可以用于标准输入输出流,也可以用于文件流上。
2.在同一个类中,可以定义重载的成员函数voidf(int);和virtualvoidf(int);。
3.抽象类不会产生实例,所以不需要有构造函数。
4.类A有一个非静态的成员函数f,其函数原型是:
voidA:
:
f()const,则该函数被调用时,一定是通过类A或类A的某后裔类的一个用const修饰符说明的常量对象调用的。
5.异常必须在其产生的当前函数中捕获,而不能在外层函数中捕获该异常。
6.只要程序中没有Aa1=a2;和Aa1(a2);形式的代码,类A的拷贝构造函数就不会被调用。
7.在protected继承方式下,派生类对象的指针不能直接转换成指向基类对象的指针。
8.若静态成员函数中调用了一个函数f,那么f一定不是虚函数。
9.若要实例化一个含有引用型数据成员的类,那么只能使用构造函数初始化列表来初始化该数据成员。
10.构造函数的函数体中,不能使用return语句;但在实现该类的自动类型转化函数时,必须有return语句。
三、回答下列各题(每题4分,共20分)
1.举例说明static关键字的用法和相应目的(至少3种)。
2.举例说明类的数据成员在哪些情况下必须在初始化列表中进行初始化(至少3种)。
3.举例说明虚拟继承的作用和目的。
4.举例说明成员函数A&f()const;和成员函数A&f();的区别。
5.有类A的对象a,任意给出一种解决方案,使得程序支持下面的表达式:
a=10+a;
四、指出下列程序代码中存在的错误或不足,说明原因。
(每题5分,共10分)
1.
#include
classA{
public:
virtual~A(){}
virtualvoidf()
{cout<<"A:
:
f()"<virtualvoidg()
{cout<<"A:
:
g()"<};
classB:
publicA
{
public:
virtualvoidg()
{cout<<"B:
:
g()"<virtualvoidk()
{cout<<"B:
:
k()"<};
voidmain()
{
A*p=newB;
p->f();
p->g();
p->k();
deletep;
}
2.
#include
#include
classA;
classB:
publicA{
public:
B(constchar*info){
m_buf=newchar[256];
strcpy(m_buf,info);}
~B(){delete[]m_buf;}
virtualvoidoutput(){cout<private:
char*m_buf;};
classA{
public:
~A(){}
virtualvoidoutput(){}
};
voidmain()
{
A*pa=newB("hello!
");
pa->output();
deletepa;
}
五、写出下面程序的运行结果(每题5分,共10分)
1.
#include
classA{
public:
A():
count
(1){}
virtual~A(){}
virtualA*Copy()const=0;
virtualvoidOut()const=0;
protected:
intcount;
};
classB:
publicA{
public:
~B(){--count;Out();}
virtualA*Copy()const{
B*p=newB(*this);
++p->count;
returnp;
}
virtualvoidOut()const
{cout<};
voidmain()
{
{
Bb;
A*a1=&b;
a1->Out();
a1=a1->Copy();
a1->Out();
deletea1;
}
}
2.
#include
classA{
public:
A(intn):
num(n){Out();}
A(constA&rhs):
num(rhs.num){Out();}
voidOut(){cout<public:
intnum;
};
classB:
publicA{
public:
B(A&a):
obj(a),A
(1){}
voidOut(){obj.Out();}
//B(constB&b){
//}
private:
Aobj;
};
voidmain(){
Aa(8);
Bb1(a);
Bb2(b1);
b2.Out();
}
六、阅读下面两个类的定义和部分实现代码,完成3个问题。
(共10分)
#include
classA{
public:
A(intn):
value(n){}
voidDisplay()const
{cout<<"Value="<