C++面向对象试题题型总结.docx
《C++面向对象试题题型总结.docx》由会员分享,可在线阅读,更多相关《C++面向对象试题题型总结.docx(22页珍藏版)》请在冰豆网上搜索。
C++面向对象试题题型总结
C++面向对象程序设计
一、单项选择题(共20题,每题1分,共20分)
1、下列关于C++标识符的命名不合法的是C与C#一样
A.PadB.name_1C.A#bcD._a12
2、若有以下类型标识符定义:
()D
intx=2;charw='a';floaty=23.45f;doublez=45.6712;
则表达式w*x+y-z的结果类型是
A.floatB.charC.intD.double
6、对重载函数形参的描述中,错误的是D重载是重点
A.参数的个数可能不同
B.参数的类型可能不同
C.参数的顺序可能不同
D.参数的个数、类型、顺序都相同,只是函数的返回值类型不同
7、以下能正确定义数组并正确赋初值的语句是D
A.intN=5,b[N][N];
B.inta[2]={{1},{3},{4},{5}};
C.intc[2][]={{1,2},{3,4}};
D.intd[3][2]={{1,2},{3,4}};
8、下列给字符数组进行的初始化中,不正确的是D
A.chars1[]="abcd";
B.chars2[3]={'x','y','\0'};
C.chars3[]={'a','x','y','\0'};
D.chars4[6]={"xyz","mnp"};
9、通常的拷贝构造函数的参数是C
A.某个对象名B.某个对象成员名
C.某个对象的引用D.某个对象的指针名
10、关于构造函数特点的描述中,错误的是A
A.定义构造函数必须指出类型(构造函数特点是无返回类型)
B.构造函数的名字与该类的类名相同
C.一个类中可定义0至多个构造函数(不写构造函数,系统会自动生成一个空的构造函数)
D.构造函数是一种成员函数
11、下面程序的运行结果为C
#include
intadd(inta,intb);
voidmain()
{
externintx,y;
cout<}
intx=20,y=5;
intadd(inta,intb)
{
ints=a+b;
-1-
returns;
}
A.20B.5C.25D.编译会提示出错信息
12、关于常成员的描述中,错误的是B
A.常成员包含常数据成员和常成员函数两种
B.常数据成员必须是公有的
C.常数据成员要使用构造函数成员初始化列表进行初始化
D.常对象只能调用它的常成员函数,不能调用其它的成员函数
13、关于友元函数的描述中,错误的是B
A.友元函数不是成员函数
B.友元函数只能访问类中私有成员
C.友元函数破坏隐藏性,尽量少用
D.友元函数说明在类体内,使用关键字friend
14、如果有intx,*p;floaty,*q;则下面操作正确的是C
A.p=xB.p=q
C.p=&xD.p=&y
16、若数组名作实参而指针变量作形参,函数调用时实参传给形参的是D
A.数组的长度
B.数组第一个元素的值
C.数组所有元素的值
D.数组第一个元素的地址
17、对于动态分配内存空间描述正确的是D
A.使用new运算符分配的内存空间的长度必需是常量
B.delete运算符可以释放动态的存储空间和静态的存储空间
C.由new分配的内存空间是不连续的
D.delete运算符只能释放由new分配的动态存储空间
18、能够释放对象所占资源的是()A
A.析构函数B.数据成员
C.构造函数D.静态成员函数
19、虚函数的定义是在基类中进行的,定义时需要冠以关键字C
A.staticB.frend
C.virtualD.public
20、在C++中串流类是在头文件strstrea.h中定义的,下列不属于串流类的是)C
A.strstreamB.ostrstream
C.ofstreamD.istrstream
二、填空题(共9题16空,每空1分,共16分)
1、函数重载时,编译系统会根据__形参的类型__或__形参的个数__来区分。
与返回类型无关
2、若有chara[80];则cin>>a表示从键盘上读入一个__字符串__到数组a中。
3、若希望用一个已有对象来构造另一个同类型的对象,可以使用__拷贝构造函数__来实现。
4、静态成员(static)属于__类__,而不属于__任何一个对象__,它被同一个类的所有对象共享。
5、类的继承方式有____继承、____继承和____继承。
public(或公有)private(或私有)protected(或保护)
6、重载运算符的含义必须清楚,不能有__二义性__。
7、按照联编进行阶段的不同,联编方法可分为两种:
__动态联编__和__静态联编__。
8、当基类中的某个成员函数被声明为虚函数后,此虚函数就可以在一个或多个派生类中被重新定义,在派生类中重新定义时,其函数原型,包括返回类型、__函数名__、__参数个数__、参数类型以及参数的顺序都必须与基类中的原型完全相同。
9、C++的I/O是以字节流的形式实现的,每个C++编译系统都带有一个面向对象的输入/输出软件包,这就是I/O流类库。
三、判断题(共10题,每题1分,共10分)
1、C++语言支持封装性和继承性,不支持多态性。
×
2、关系运算符可以用来比较两个字符的大小,也可用来比较两个字符串的大小。
)×
3、字符串"sdfgh"的长度是5。
√占用空间好像是6,字符串有个结尾符号占空间。
4、引用和指针都可作函数参数。
√
5、友元函数说明在类体内,它是一种成员函数。
×说明(定义)在类外,声明在类里面
6、友元类必须被说明为公有成员。
×
7、纯虚函数是在基类中说明的虚函数,它在该基类中没有定义具体的操作内容。
√
8、析构函数不能被继承。
√
9、运算符重载以后,其优先级和结合性都不能改变。
√
10、在C++中,函数名实际上是一个指针,它指向函数的入口。
√
四、分析程序,回答所提出的问题(16分)
1、#include
classB;
classA
{
public:
A(inti)
{a=i;}
friendintF(A&f1,B&f2);
private:
inta;
};
classB
{
public:
B(inti)
{b=i;}
friendintF(A&f1,B&f2);
private:
intb;
};
intF(A&f1,B&f2)\\可以访问类A,类B里的任何成员
{
return(f1.a+f2.b)*(f1.a-f2.b);
}
voidmain()
{
An1(10);//a=10
第3/7页
Bn2(8);//b=8
cout<}
①写出程序的运行结果。
36
②该程序中共有几个对象,分别属于哪个类?
为什么在程序的开头处通过语句classB;对类B进行声明?
③程序中的哪两条语句会分别调用A、B的构造函数?
写出这两个构造函数。
④函数F是什么函数?
它的作用是什么?
①36
②n1和n2两个对象,n1属于A类,n2属于B类。
因为B类的定义在A类后,而A类中要引用B类。
③语句An1(10);和语Bn2(8);
A类的构造函数:
A(inti){a=i;}
B类的构造函数:
B(inti){b=i;}
④函数F是友元函数。
它的作用是:
提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间共享数据的机制。
(关键答出共享数据、或答出通过友元可以访问到封装与类A、B中的数据)
二、
五、阅读程序,写出运行结果(共2题,第1题6分,第2题8分,共14分)
1、#include
intfunc(inta)
{
intb=0;
staticintc=4;\\静态变量
b++;c--;
return(a+b+c);
}
voidmain()
{
inta=2;
for(intj=0;j<2;j++)
cout<}
输出结果为:
66
注意66中间有空格
2、#include
classX
{
public:
X(inti)
{x=i;cout<<”int:
”<
X(doublei)
{x=(int)i*2;cout<<”double:
”<
~X()
{cout<<”~X():
”<private:
intx;
};
voidmain()
{
inta=8;
doubleb=11.0;
Xx1(55),x2(a*5);
Xx3=X(2*a);
Xx4=X(b);
}
输出结果为:
int:
55,called//X1被创建
int:
40,called//x2被创建
int:
16,called//x3被创建
double:
11,called//x4被创建x值为22,显示的是i值,不改变
~x<>:
22,called//析构函数的调用顺序与构造函数调用顺序相反
~x<>:
16,called
~x<>:
40,called
~x<>:
50,called
六、编写程序(共2题,第1题10分,第2题14分,共24分)
1、输入一组数据以-1作为结束标志,要求删除其它数据只保留能被2整除的数据并输出结果。
#include
voidmain()
{
intb[50],x,n=0;
cin>>x;
while(x!
=-1)
{
b[++n]=x;
cin>>x;
}
for(inti=1,j=0;i<=n;i++)
if(b[i]%2==0)b[++j]=b[i];
for(i=1;i<=j;i++)
cout<
cout<}
2、定义一个日期类Date,包含年、月、日三个数据成员,以及一个求第二天日期的成员函数和输出日期的成员函数。
#include
classDate
{
private:
intyear,month,day;
public:
Date(inty,intm,intd)
{
year=y;
month=m;
day=d;
}
voidnextday();
voiddisplay()
{
cout<}
};
voidDate:
:
nextday()
{
int
totaldays[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};
day++;
intleap=(year%400==0||year%4==0&&year%100!
=0);
if(day>totaldays[leap][month-1])
{
day=1;month++;
if(month>12)
{
month=1;year++;
}
}
}
voidmain()
{
intd,m,y;
cout<<"请输入年、月、日:
\n";
cin>>y>>m>>d;
Dated1(y,m,d);
cout<<"今天是:
";d1.display();d1.nextday();
cout<<"明天是:
";d1.display();}
填空题(每空1分,共14分)
观看以下程序:
classpoint{
public:
voidshow(){cout<<”point”<};
voidmain()
{
pointp1;
point*p;
p=&p1;
_______________//通过对象p1访问show函数
______________//通过指针p访问show函数
}
在C++类中可以包含______________、______________和______________三种具有不同访问控制权的成员。
定义类时,在类头中将使用关键字_____________来表示类定义的开始。
如果一个类中至少有一个纯虚函数,则该类称为________________。
C++类的组成包括数据成员和______________,友元_____(是、不是)该类的成员函数。
友员函数是用关键字____________修饰的非成员函数。
若有:
inti;
int&j=i;
i=10;
j=i+1;
则i=__________,j=__________。
8、new的功能是____________________,delete的功能是____________________。
选择题(每小题1.5分,共30分)
1、下列特性中不是面向对象程序设计语言所特有的是()。
(A)数据封装(B)继承(C)多态性(D)模板
2、()是给变量取一个别名,它引入了变量的同意词。
(A)指针(B)引用(C)枚举(D)结构
3、类成员的访问权限中,()只能被本类的成员函数和其友元函数访问。
(A)share(B)public(C)private(D)protected
4、关于构造函数,下列说法不正确的是()。
(A)构造函数名字和类名相同
(B)构造函数在创建对象时自动执行
(C)构造函数无任何函数返回类型
(D)构造函数有且只有一个
7、C++语言是从早期的C语言逐渐发展演变而来的.与C语言相比,它在求解问题方法上进行的最大改进是()
(A)面向过程 (B)面向对象 (C)安全性 (D)复用性
8、对于类中定义的成员,其隐含访问权限为()。
A.publicB.protected
C.privateD.static
9、下面有关重载函数的说法中正确的是()
(A)重载函数必须具有不同的返回值类型; (B)重载函数形参个数必须不同;
(C)重载函数必须有不同的形参列表 (D)重载函数名可以不同;
10、有如下的对类“CSample”的说明,其中()是错误的。
classCSample{
A.inta=23;
B.CSample();
public:
C.CSample(intval);
D.~CSample();
11、在inta=3,int*p=&a;中,*p的值是()
A.变量a的地址值B.无意义
C.变量p的地址值D.3
12、每个类()构造函数。
(A)只能有一个(B)只可有公有的
(C)可以有多个(D)只可有缺省的
13、在一个类中可以对一个操作符进行()重载。
(A)1种(B)2种以下(C)3种以下(D)多种
14、在公有继承的情况下,基类非私有成员在派生类中的访问权限()
(A)受限制(B)保持不变(C)受保护(D)不受保护
15、应在下列程序划线处填入的正确语句是()
#include
classBase
{public:
voidfun(){cout<<"Base:
:
fun"<};
classDerived:
publicBase
{voidfun()
{_____________//显示调用基类的函数fun()
cout<<"Derived:
:
fun"<}
};
(A)fun();(B)Base.fun();(C)Base:
:
fun();(D)Base->fun();
16、执行下面的程序将输出()
#include
classBASE{
charc;
public:
BASE(charn):
c(n){}
virtual~BASE(){cout<};
classDERIVED:
publicBASE{
charc;
public:
DERIVED(charn):
BASE(n+1),c(n){}
~DERIVED(){cout<};
intmain()
{DERIVEDa('X');
return0;
}
(A)XY (B)YX (C)X (D)Y
下面描述中,表达错误的是()
(A)公有继承时基类中的public成员在派生类中仍是public的
(B)公有继承是基类中的private成员在派生类中仍是private的
(C)公有继承时基类中的protected成员在派生类中仍是protected的
(D)私有继承时基类中的public成员在派生类中是private的
18、定义析构函数时,应该注意()
(A)其名与类名完全相同(B)返回类型是void类型
(C)无形参,也不可重载(D)函数体中必须有delete语句
19、对于在类中定义的静态数据成员,下面正确的说法是()
A.该类的每个对象中都有一个静态数据成员
B.对象创建时产生
C.在类外进行初始化
D.既可以在类外初始化,也可以在类内初始化
20、C++中声明常量的关键字是()。
A.constB.externC.publicD.enum
改错题(每处2分,共6分)
使用VC6打开考生文件夹下的工程proj1,此工程包含一个源程序文件main.cpp,但该程序运行有问题,请改正main函数中的错误,使程序的输出结果为:
member=0
member=5
menber=10
源程序文件main.cpp清单如下:
#include
class MyClass
{
public:
MyClass(int i){member=i;}
void SetMember(int m){member=m;}
int GetMember()const{return menber;}
void print()cont{cout<<"member="<private:
int member;
};
voed main()
{
MyClass obj1;//更正_____________________________
obj1.print();
MyClass obj2(3);
obj1.member=5;//更正__________________________
MyClass.SetMember(10);//更正_______________________
obj1.print();
obj2.print();
}
写出下列程序的执行结果(每小题5分,共20分)
#include
classSample
{intn;
public:
Sample(inti){n=i;}
friendintadd(Sample&s1,Sample&s2);
};
intadd(Sample&s1,Sample&s2)
{
returns1.n+s2.n;
}
voidmain()
{
Samples1(10),s2(20);
cout<}
执行结果是:
#include
intadd(intx,inty)
{
returnx+y+1;
}
doubleadd(doublex,doubley)
{
returnx+y-1;
}
voidmain()
{
inta=2,b=4;
doublec=2.6,d=7.4;
cout<}
执行结果是:
3、
#include
classA
{
public:
intn;
};
classB:
virtualpublicA{};
classC:
virtualpublicA{};
classD:
publicB,publicC
{
intgetn(){returnB:
:
n;}
};
voidmain()
{
Dd;
d.B:
:
n=10;
d.C:
:
n=20;
cout<:
n<<","<:
n<}
执行结果是:
4、
#include
classmyclass
{
inta,b;
staticints;
public:
myclass(intx,inty)
{a=x;b=y;s++;}
voidprint()
{cout<
};
intmyclass:
:
s=0;
voidmain()
{
myclassm1(1,2),m2(4,5),m3(6,7);
m1.print();
m2.print();
m3.print();
}
执行结果是:
编程题(每题10分、共30分)
测试一个名为rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,能计算矩形的面积。
(10分)
定义一boat与car两个类,二者都有weight属性,定义二者的一个友元函数totalweight(),计算二者的重量和。
(10分)
设计一个汽车类vehicle,包含的数据成员有车轮个数wheels和车重weight。
小车类car是它的派生类,其中包含载人数passenger_load。
每个类都有相关数据的输出方法。
在主程序中定义一个car类对象,对其车轮个数、车重、载人数进行设置并显示。
(10分)
填空题(每空1分,共14分)
(1)p1.show();p->show()
(2)公有、私有、保护(3)class(4)抽象类
(5)成员函数、不是(6)friend(7)11、11(8)动态申请内存空间、释放由new申请的空间
选择题(每小题1.5分,共30分)
1、D2、B