C++期末考试题及答案1.docx
《C++期末考试题及答案1.docx》由会员分享,可在线阅读,更多相关《C++期末考试题及答案1.docx(9页珍藏版)》请在冰豆网上搜索。
C++期末考试题及答案1
1.关于C++与C语言关系的描述中,(D)是错误的。
a.C语言是C++语言的一个子集
b.C语言与C++语言是兼容的
c.C++语言对C语言进行了一些改进
d.C++语言和C语言都是面向对象的
2.按照标识符的要求,(A)符号不能组成标识符。
a.连接符b.下划线
c.大小写字母d.数字字符
3.为了避免嵌套的if-else语句的二义性,C语言规定else总是与(C)组成配对关系。
a.缩排位置相同的ifb.在其之前未配对的if
c.在其之前未配对的最近的ifd.同一行上的if
4.在"inta[][3]={{1},{3,2},{4,5,6},{0}};"中,a[2][2]的值是(C)。
a.1b.0c.6d.2
5.设"char**s;",以下正确的表达式是(B)。
a.s="computer";b.*s="computer";
c.**s="computer";d.*s='c';
6.对于"int*pa[5];"的描述中,(D)是正确的。
a.pa是一个指向数组的指针,所指向的数组是5个int型元素
b.pa是一个指向某数组中第5个元素的指针,该元素是int型变量
c.pa[5]表示某个元素的第5个元素的值
d.pa是一个具有5个元素的指针数组,每个元素是一个int型指针
7.在下列表示引用的方法中,(A)是正确的。
已知:
intm=10;
a.int&x=m;b.int&y=10;
c.int&z;d.float&t=&m;
8.下列for循环的次数为(B)。
for(i=0,x=0;!
x&&i<=5;i++)
a.5b.6c.1d.无限
9.对于C/C++语言的函数,下列叙述中正确的是(A)。
a.函数的定义不能嵌套,但函数调用可以嵌套
b.函数的定义可以嵌套,但函数调用不能嵌套
c.函数的定义和调用都不能嵌套
d.函数的定义和调用都可以嵌套
10.在一个被调用函数中,关于return语句使用的描述,(D)是错误的。
a.被调用函数中可以不用return语句
b.被调用函数中可以使用多个return语句
c.被调用函数中,如果有返回值,就一定要有return语句
d.被调用函数中,一个return语句可以返回多个值给调用函数
11.在一个函数中,要求通过函数来实现一种不太复杂的功能,
并且要求加快执行速度,选用(A)
a.内联函数b.重载函数
c.递归调用d.嵌套调用
12.使用fseek函数可以实现的操作是(A)。
a.改变文件指针的当前位置
b.文件的顺序读写
c.文件的随机读写
d.以上都不对
13.下列存储标识符中,(C)的可见性与存在性不一致
a.外部类b.自动类
c.内部静态类d.寄存器类
14.在如下结构定义中,不正确的是(B)。
a.structstudent
{intno;
charname[10];
floatscore;
};
b.structstud[20]
{
intno;
charname[10];
floatscore;
};
c.structstudent
{
intno;
charname[10];
floatscore;
}stud[20];
d.struct
{
intno;
charname[10];
floatscore;
}stud[100];
15.将两个字符串连接起来组成一个字符串时,
选用(C)函数。
a.strlen()
b.strcpy()
c.strcat()
d.strcmp()
16.(D)不是构造函数的特征
a.构造函数的函数名与类名相同
b.构造函数可以重载
c.构造函数可以设置缺省参数
d.构造函数必须指定类型说明
17.已知:
类A中一个成员函数说明如下:
voidSet(A&a);
其中,A&的含义是(C)。
a.指向类A的指针为a
b.将a的地址值赋给变量Set
c.a是类A对象的引用,用来作函数Set()的参数
d.变量A与a按位与作为函数Set()的参数
18.已知:
print()函数是一个类的常成员函数,它无返回值,下列表示中,(A)是正确的。
a.voidprint()const;b.constvoidprint();
c.voidconstprint();d.voidprint(const);
19.关于虚函数的描述中,(C)是正确的。
a.虚函数是一个static类型的成员函数
b.虚函数是一个非成员函数
c.基类中说明了虚函数后,派生类中将其对应的函数可不必说明为虚函数
d.派生类的虚函数与基类的虚函数具有不同的参数个数和类型
20.关于new运算符的下列描述中,(D)是错的。
a.它可以用来动态创建对象和对象数组
b.使用它创建的对象和对象数组可以使用运算符delete删除
c.使用它创建对象时要调用构造函数
d.使用它创建对象数组时必须指定初始值
三、(6分)分析下面程序的运行结果
#includeclassB
{
public:
B(){}
B(inti){b=i;}
virtualvoidvirfun()
{
cout<<"B:
:
virfun()called.\n";
}
private:
intb;
};
classD:
publicB
{
public:
D(){}
D(inti,intj):
B(i){d=j;}
private:
intd;
voidvirfun()
cout<<"D:
:
virfun()called.\n";
}
};
voidfun(B*obj)
{obj->virfun();
}
voidmain()
{
D*pd=newD;fun(pd);
}
四、(9分)下面的程序可以统计命令行第一个参数中出现的字母个数,请填充下面空白,完成程序。
#include
#include
voidmain(intargc,argv[];)
{
char*str;intcount=0;
if(argc<2)exit
(1);
str=
while(*str)
if(isalpha())count++;
printf("\n字母个数:
%d\n",count);
}
提示:
intisalpha(intch)函数功能是检查ch是否是字母
五、(8分)定义一个字符栈类Stack(包括类的实现)。
数据成员包括一个存放字符的数组stck[]和一个栈指针tos。
栈数组的尺寸由常量SIZE确定。
栈的基本操作为Push()和Pop()o
六、(10分)完成下面的函数,对有n个元素的数组a,使数组元素按逆序排列。
voidinverse(int*a,intn)
{
}
七、(12分)下面的函数统计子字符串substr在字符串str中出现的次数,如果substr在str中不出现,则返回值0。
请完成该函数。
intstr_count(char*substr,char*str)
{
}
二、问答题
1、虚析构函数有什么作用?
解答要点:
对象销毁时,需要调用析构函数。
在多态调用时,是用基类的指针访问派生类的对象。
如果析构函数是非虚函数,则基类指针只能访问基类的析构函数,而不能访问派生类的析构函数,导致派生类对象销毁时,没有调用派生类的析构函数,只是调用了基类的析构函数。
如果把析构函数定义成虚函数,则可克服这个问题。
2、拷贝构造函数在哪几种情况下调用?
解答要点:
用一个对象初始化另一个对象时当用对象作为函数参数传递时当函数返回对象时
3、函数重载与函数覆盖有什么不同,它们与多态有什么关系?
解答要点:
函数重载是指函数名相同,而函数的参数个数或类型不同;覆盖是指在派生类中成员函数与基类成员函数的函数名、参数个数、类型与返回值均相同;C++中正是通过虚函数的覆盖,实现多态的功能。
4、C++继承是如何工作的?
答:
继承使得派生类能够使用基类的公有和保护成员,从而实现代码的复用,派生类可以增加成员,也可以隐藏和覆盖基类的成员。
对于公有继承,基类成员的访问权限在派生类保持不变。
5、类与对象有什么区别?
答:
类是类型,是对象的抽象,对象是类的具体实例。
一个类可以有多个对象,每个对象都有自己的存储单元,而类不占存储单元。
三、运行结果为:
D:
:
virfun()called.
四、填空
①char*②argv[1]③*str++
五、(8分)定义一个字符栈类Stack(包括类的实现)。
数据成员包括一个存放字符的数组stck[]和一个栈指针tos。
栈数组的尺寸由常量SIZE确定。
栈的基本操作为Push()和Pop()。
constintSIZE=27;
classStack
{
public:
Stack():
tos(0){};
voidPush(charch);
charPop();
private:
charstck[SIZE];
inttos;
};
voidStack:
:
Push(charch)
{
if(tos==SIZE)
cout<<"\nStackisfull\n";else{
stck[tos]=ch;tos++;
}
}
charStack:
:
Pop()
{
if(tos==0){
cout<<"\nStackisempty\n";
return0;
}
tos--;
returnstck[tos];
六、(10分)完成下面的函数,对有n个元素的数组a,使数组元素按逆序排列。
voidinverse(int*a,intn)
{
}
inti,*p;
p=newint[n];
for(i=0;i<=n-1;i++)
p[i]=a[i];
for(i=0;i<=n-1;i++)
a[i]=p[n-i-1];
delete[]p;
七、(12分)下面的函数统计子字符串substr在字符串str中出现的次数,如果substr在str中不出现,则返回值0。
请完成该函数。
intstr_count(char*substr,char*str)
{
}
intcount=0;
char*pChar;
if(substr==NULL||str==NULL)returncount;
while(*str!
='\0'){
pChar=substr;
while(*pChar==*str){pChar++;if(*pChar=='\0'){count++;break;
}
elsestr++;
}//Matchwhile(*pCh...)statement
str++;
}//Matchwhile(*str...)statement
returncount;