C++试题.docx
《C++试题.docx》由会员分享,可在线阅读,更多相关《C++试题.docx(35页珍藏版)》请在冰豆网上搜索。
![C++试题.docx](https://file1.bdocx.com/fileroot1/2023-2/21/2bef05ba-b906-4e2b-a908-37fcd7b96905/2bef05ba-b906-4e2b-a908-37fcd7b969051.gif)
C++试题
清华大学计算机系C++期末考试题及答案
一、填空题(25小题,共50分)
(以下每小题1分,共10分)
1.在C++中,函数的参数有两种传递方式,它们是值传递和 地址或指针或引用传递。
2.当一个成员函数被调用时,该成员函数的 this指针 指向调用它的对象。
3.在基类和派生类中,派生类可以定义其基类中不具备的数据和操作。
对两个有相同名字的数据成员进行访问时,如果没有 作用域分隔符限定时 ,对此数据成员的访问将出现歧义。
4.拷贝构造函数使用 引用 作为参数初始化创建中的对象。
5.在公有继承的情况下,基类数据成员在派生类中的访问权限 保持不变 。
6.描述命题"A小于B或小于C"的表达式为 A
7.用new申请某一个类的动态对象数组时,在该类中必须能够匹配到 没有形参的或缺省参数 构造函数,否则应用程序会产生一个编译错误。
8.静态数据成员在类外进行初始化,且静态数据成员的一个拷贝被类的所有对象 共享 。
9.为了避免可能出现的歧义,C++对if…else语句配对规则规定为:
else总是与 与最近的if 配对。
10.设"inta=3,b=4,c=5;",表达式"(a+b)>c&&b==c"的值是 0 。
(以下每小题2分,共20分)
11.面向对象的程序设计有四大特征,它们是抽象、封装、继承、多态 。
12.在VisualC++中,定义重载函数时,应至少使重载函数的参数个数或参数类型 不同 ;在基类和派生类中,成员函数的覆盖是指 派生类成员函数与在基类被覆盖的成员函数名、参数个数、参数类型和返回值类型均相同 。
13.构造函数与析构函数除功能不同外,在定义形式上,它们的区别还包括构造函数名与类名相同,而析构函数名是在类名前加一个~、 析构函数没有参数、析构函数可以定义为虚函数 。
14.动态联编要满足两个条件,它们是 被调用的成员函数是虚函数、用指针或引用调用虚函数 。
15.在C++类中,有一种不能定义对象的类,这样的类只能被继承,称之为 抽象类 ,定义该类至少具有一个纯虚函数 。
16.在C++类中,const关键字可以修饰对象和成员函数,const对象不能 被修改 ,const成员函数不能 修改类数据成员 。
17.举出C++中两种用户自定义的数据类型:
类 、 枚举 。
18.C++中没有字符串类型,字符串是通过 字符数组 来表示的,每一个字符串都有一个结尾字符 \0 。
19.C++中没有输入输出语句,输入输出是通过 输入输出库 实现的,写出一条打印整型变量n的输出语句:
cout< 20.举出C++中两种代码复用的方式:
继承、复用 。
(以下每小题4分,共20分)
21.下面程序的运行结果是 3 。
#include
voidmain()
{
chara='a',b='j';
floatx;
x=(b-a)/('F'-'A');
printf("%d\n",(int)(3.14*x));
}
22.下面程序的运行结果是2581114。
#include"iostream.h"
voidmain()
{
inti=1;
while(i<=15){
i++;
if(i%3!
=2)continue;
elsecout<<"i="<
}
}
23.下面程序的运行结果是________。
#include"iostream.h"
classtest
{
private:
intnum;
floatfl;
public:
test();
intgetint(){returnnum;}
floatgetfloat(){returnfl;}
~test();
};
test:
:
test()
{
cout<<"Initalizingdefault"< num=0;fl=0.0;
}
test:
:
~test()
{
cout<<"Desdtructorisactive"< }
voidmain()
{
testarray[2];
cout< }
Initalizingdefault
Initalizingdefault
00
Desdtructorisactive
Desdtructorisactive
24.下面程序的运行结果是________。
#include
classA
{
public:
A(){cout<<"A:
:
A()called.\n";}
virtual~A(){cout<<"A:
:
~A()called.\n";}
};
classB:
publicA
{
public:
B(inti){
cout<<"B:
:
B()called.\n";
buf=newchar[i];}
virtual~B()
{
delete[]buf;
cout<<"B:
:
~B()called.\n";
}
private:
char*buf;
};
voidfun(A*a)
{
deletea;
}
voidmain()
{
A*a=newB(15);
fun(a);
}
A:
:
A()called.
B:
:
B()called.
B:
:
~B()called.
A:
:
~A()called.
25.下面程序的运行结果是________。
#include
inta[]={1,3,5,7,9};
int*p[]={a,a+1,a+2,a+3,a+4};
voidmain()
{
printf("%d\t%d\t%d\n",a[4],*(a+2),*p[1]);
printf("%d\t%d\t%d\n",**(p+1)+a[2],*(p+4)-*(p+0),*(a+3)%a[4]);
}
953
847
二、问答题(每小题5分,共20分)
1.若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,它可能会产生什么问题?
解答要点:
当对象含有指针数据成员,并用它初始化同类型的另一个对象时,缺省的拷贝构造函数只能将该对象的数据成员复制给另一个对象,而不能将该对象中指针所指向的内存单元也复制过去。
这样,就可能出现同一内存单元释放两次,导致程序运行出错。
2.简述成员函数、全局函数和友元函数的差别。
解答要点:
以下几点必须说清楚:
成员函数是在类内部定义的,作用域在类的内部,成员函数可以访问类的数据成员(公有、保护和私有数据成员),可以调用该类的其它成员函数(公有、保护和私有成员函数),可以调用全局函数。
如果友元函数是另一个类的公有成员函数,则该类的成员函数也只能通过那个类的对象调用,不能调用那个类的保护和私有成员函数。
非本类成员函数(其它类成员函数或全局函数)可以通过该类的对象访问该类的公有数据成员和调用该类的的公有成员函数。
不是在类中定义的成员函数都是全局函数。
如果某一个函数(全局函数或类的成员函数)定义为另一个类的友元函数,需要在那个类中用friend关键字声明,友元函数并不是类的成员,它的定义自然是在那个类的外面。
3.简述结构化的程序设计、面向对象的程序设计的基本思想。
解答要点:
结构化的程序设计将数据和对数据的操作分离,程序是由一个个的函数组成的,面向对象的程序设计将数据和操作封装在一起,程序是由一个个对象组成的,对象之间通过接口进行通信,它能够较好地支持程序代码的复用。
4.结构struct和类class有什么异同?
解答要点:
struct和class都可以定义类,但是缺省访问权限说明时,struct的成员是公有的,而class的成员是私有的。
在C++中,struct可被class代替。
三、找出下面程序(或程序段)中的语法错误,并予以纠正(每小题4分,共8分)
(1)程序功能是倒序输出各给定的字符串。
#include
voidmain()
{
charstr[5][]={"First","Second","Third","Forth","Fifth"};
char*cp[]={str[4],str[3],str[2],str[1],str[0]};
inti;
while(i<=5)
{
printf("%c",*(cp+i));
i++;
}
}
①"charstr[5][]={"First","Second","Third","Forth","Fifth"};"应为
"charstr[5][10]={"First","Second","Third","Forth","Fifth"};"
②"while(i<=5)"应为"while(i<5)"
③"printf("%c",*(cp+i));"应为"printf("%s",*(cp+i));"
④"inti;"应为"inti=0;"
(2)程序功能是将各个平方根值放入数组中。
#include
voidmain()
{
intmax,a,i;
scanf("%d%d",max,a);
doublex[max];
for(i=0;i x[i]=sqrt(a*i);
}
①增加"#include"
②"scanf("%d%d",max,a);"应为"scanf("%d%d",&max,&a);"
③"doublex[max];"改为:
"double*x=newdouble[max];"
…
"delete[]x;"
四、(8分)下列shape类是一个表示形状的抽象类,area()为求图形面积的函数,total()则是一个通用的用以求不同形状的图形面积总和的函数。
请从shape类派生三角形类(triangle)、矩形类(rectangle),并给出具体的求面积函数
classshape{
public:
virtualfloatarea()=0;
};
floattotal(shape*s[],intn)
{
floatsum=0.0;
for(inti=0;i sum+=s[i]->area();
returnsum;
}
classTriangle:
publicShape
{
public:
Triangle(doubleh,doublew){H=h;W=w;}
doubleArea()const{returnH*W*0.5;}
private:
doubleH,W;
};
classRectangle:
publicShape
{
public:
Rectangle(doubleh,doublew){H=h;W=w;}
doubleArea()const{returnH*W;}
private:
doubleH,W;
};
五、(6分)完成顺序查找函数f_seq()。
其过程是:
从表头开始,根据给定的模式,逐项与表中元素比较。
如果找到所需元素,则查找成功,并打印出它在表中的顺序号。
如果查找整个表仍未找到所需对象,则查找失败
#include
voidf_seq(char*list[],char*object,intlen)
//list指针数组,指向字符串
//object模式串
//len表的长度
{
char**p;
intstrcmp(char*s,char*t);
p=list;
while(_____①______)//p if(strcmp(*p,object)==0)
break;
else______②_______;//p++
if(p printf("Success!
**%d\n",p-list);
elseprintf("Unsuccess!
\n");
}
intstrcmp(char*s,char*t)
{
for(;*s==*t;s++,t++)
if(*s=='\0')
return(0);
return(_____③______);//s-t或*s-*t或1
}
六、(8分)完成使链表逆置函数reverse,若有链表:
链表结点的结构如下:
structnode
{
intnum;
structnode*next;
}
structnode*reverse(structnode*head)
//head链表头结点
{
structnode*p,*temp1,*temp2;
if(head==NULL____①____)returnhead;//||head->next==NULL
p=head->next;head->next=NULL;
while(____②____)//p!
=NULL或p
{
temp1=head;
____③____;//head=p;
temp2=p;
p=p->next;
____④____;//temp2->next=temp1;或head->next=temp1;
}//Matchwhilestatenment
returnhead;//返回逆置后的链表的头结点
}
答案
一、单项选择题(本大题共10小题,每小题2分,共20分)在每小题列出的四个备选项中,只有一个是符合题目要求的,请将其代码填写在题后的括号内。
错选、多选或未选均无分。
1.说明内联函数的关键字是( )。
A.inline B.virtual C.define D.static
参考答案:
2.假定CAb为一个类,则执行CAboX;语句时将自动调用该类的()
A.有参构造函数 B.无参构造函数
C.拷贝构造函数 D.赋值重载函数
参考答案:
3.cin是某个类的标准对象的引用,该类是( )。
A.ostream B.istream C.stdout D.stdin
参考答案:
4.下面的哪个保留字不能作为函数的返回类型?
( )
A.void B.int C.new D.long
参考答案:
5.不能参与重载的运算符是( )。
A.类 B.函数 C.函数模板 D.运算符
参考答案:
6.由于数据隐藏的需要,静态数据成员通常被说明为( )。
A.私有的 B.公有的 C.保护的 D.不可访问的
参考答案:
7.编译时多态性使用什么获得?
( )
A.重载函数 B.继承 C.虚函数 D.B和C
参考答案:
A
8.拷贝构造函数的参数通常是( )。
A.无特殊要求 B.指向对象的指针
C.自已类对象的常引用 D.对象
参考答案:
9.C++有几种联编?
( )
A.1种 B.2种 C.3种 D.4种
参考答案:
B
10.基类和派生类可以分别称为( )。
A.“大类”和“小类” B.“父类”和“子类”
C.“小类”和“大类” D.“子类”和“父类”
参考答案:
B
二、判断正误题(本大题共6小题,每小题2分,共12分)判断正误,在题后的括号内,正确的划上“√”错误的划上“×”。
1.不可以定义抽象类的对象。
( )
参考答案:
.
2.内联函数的定义必须出现在第一次调用内联函数之前。
( )
参考答案:
√
3.模板函数与函数模板的意义完全相同。
( )
参考答案:
×
4.只有常成员函数才可以操作常对象。
( )
参考答案:
√
5.引用可以不初始化。
( )
参考答案:
×
6.使用new运算符创建数组时,可以为该数组指定初始值。
( )
参考答案:
×
三、填空题(本大题共6小题,每小题2分,共12分)不写解答过程,将正确的答案写在每小题的空格内。
错填或不填均无分。
1.设函数max是由函数模板实现的,并且max(3.5,5)和max(3,5)都是正确的函数调用,则此函数模板具有( )个类型参数。
参考答案:
2
2.在C++中,函数重载与虚函数帮助实现了类的( )性。
参考答案:
多态
3.由static修饰的数据成员为该类的所有对象( )。
参考答案:
共享
4.重载函数在参数类型或参数个数上不同,但( )相同。
参考答案:
函数名
5.使用new建立的动态对象在不用时必须用( )释放所占用的空间。
参考答案:
delete
6.重载运算符“<<”的函数名为( )。
参考答案:
operator<<
四、程序分析题(本大题共4小题,每小题5分,共20分)给出下面各程序的输出结果。
1.阅读下面程序,写出输出结果。
#include
usingnamespacestd;
classCPosition
{
public:
CPosition(intiPositionX=0,intiPositionY=0):
m_iPositionX(iPositionX)
{
m_iPositionY=iPositionY;
}
intGetPositionX()const
{
returnm_iPositionX;
}
intGetPositionY()const
{
returnm_iPositionY;
}
voidSetPositionX(intiPositionX)
{
m_iPositionX=iPositionX;
}
voidSetPositionY(intiPositionY)
{
m_iPositionY=iPositionY;
}
private:
intm_iPositionX; //X坐标
intm_iPositionY; //X坐标
};
intmain(void)
{
CPositionoPostion1;
constCPositionoPostion2(6,8);
cout< oPostion1.SetPositionX(16);
cout< oPostion1.SetPositionY(18);
cout<
cout< cout<
return0;
}
上面程序的输出结果为:
参考答案:
0
16
18
6
8
2.阅读下面程序,写出输出结果。
#include
usingnamespacestd;
temp