C++期末考试题及答案 下载本文

{

int no;

char name[10]; float score; }stud[100] ;

15. 将两个字符串连接起来组成一个字符串时,选用(3 )函数。 a.strlen( ) b.strcpy( ) c.strcat( ) d.strcmp( )

16. ( 4)不是构造函数的特征

a.构造函数的函数名与类名相同 b.构造函数可以重载

c.构造函数可以设置缺省参数 d.构造函数必须指定类型说明

17. 已知:类A中一个成员函数说明如下: void Set(A&a);

其中,A&的含义是(3 )。 a.指向类A的指针为a

b.将a的地址值赋给变量Set

c.a是类A对象的引用,用来作函数Set()的参数 d.变量A与a按位与作为函数Set( )的参数

18. 已知:print( )函数是一个类的常成员函数,它无返回值,下列表示中,( 1)是正确的。 a.void print( ) const; b.const void print( ); c.void const print( ); d.void print(const);

19. 关于虚函数的描述中,(3 )是正确的。 a.虚函数是一个static类型的成员函数 b.虚函数是一个非成员函数

c.基类中说明了虚函数后,派生类中将其对应的函数可不必说明为虚函数 d.派生类的虚函数与基类的虚函数具有不同的参数个数和类型 20. 关于new运算符的下列描述中,( 4)是错的。 a.它可以用来动态创建对象和对象数组

b.使用它创建的对象和对象数组可以使用运算符delete删除 c.使用它创建对象时要调用构造函数

d.使用它创建对象数组时必须指定初始值

二、问答题(15分)

1、 (3分)虚析构函数有什么作用?

2、 (3分)拷贝构造函数在哪几种情况下调用?

3、 (4分)函数重载与函数覆盖有什么不同,它们与多态有什么关系? 4、 (3分)C++继承是如何工作的? 5、 (2分)类与对象有什么区别?

三、(6分)分析下面程序的运行结果 #include class B {

public: B(){}

B(int i){b=i;}

virtual void virfun() {

cout<<\ } private: int b; };

class D:public B {

public: D(){}

D(int i,int j):B(i){d=j;} private: int d;

void virfun() {

cout<<\ } };

void fun(B *obj) {

obj->virfun(); }

void main() {

D *pd=new D; fun(pd); } 四、(9分)下面的程序可以统计命令行第一个参数中出现的字母个数,请填充下面空白,完成程序。

#include #include

void main(int argc, argv[];) {

char *str; int count=0;

if(argc<2)exit(1);

str= ; while(*str)

if(isalpha( )) count++;

printf(\字母个数:%d\\n\ }

提示:int isalpha(int ch)函数功能是检查ch是否是字母 五、(8分) 定义一个字符栈类Stack(包括类的实现)。数据成员包括一个存放字符的数组stck[ ]和一个栈指针tos。栈数组的尺寸由常量SIZE确定。栈的基本操作为Push()和Pop()。

六、(10分)完成下面的函数,对有n个元素的数组a,使数组元素按逆序排列。 void inverse(int *a, int n) { } 七、(12分)下面的函数统计子字符串substr在字符串str中出现的次数,如果substr在str中不出现,则返回值0。请完成该函数。 int str_count(char *substr, char *str) { }

一、 选择填空题

1、D 2、A 3、C 4、C 5、B 6、D 7、A 8、B 9、A 10、D 11、A 12、A 13、C 14、B 15、C 16、D 17、C 18、A 19、C 20、D

二、问答题

1、 虚析构函数有什么作用? 解答要点:

对象销毁时,需要调用析构函数。在多态调用时,是用基类的指针访问派生类的对象。如果析构函数是非虚函数,则基类指针只能访问基类的析构函数,而不能访问派生类的析构函数,导致派生类对象销毁时,没有调用派生类的析构函数,只是调用了基类的析构函数。如果把析构函数定义成虚函数,则可克服这个问题。

2、 拷贝构造函数在哪几种情况下调用? 解答要点:

用一个对象初始化另一个对象时 当用对象作为函数参数传递时 当函数返回对象时

3、 函数重载与函数覆盖有什么不同,它们与多态有什么关系? 解答要点:

函数重载是指函数名相同,而函数的参数个数或类型不同;覆盖是指在派生类中成员函数与基类成员函数的函数名、参数个数、类型与返回值均相同;C++中正是通过虚函数的覆盖,实现多态的功能。

4、 C++继承是如何工作的? 解答要点:

继承使得派生类能够使用基类的公有和保护成员,从而实现代码的复用,派生类可以增加成员,也可以隐藏和覆盖基类的成员。对于公有继承,基类成员的访问权限在派生类保持不变。

5、 类与对象有什么区别? 解答要点:

类是类型,是对象的抽象,对象是类的具体实例。一个类可以有多个对象,每个对象都有自己的存储单元,而类不占存储单元。

三、运行结果为: D::virfun() called.

四、填空

① char * ② argv[1] ③ *str++

五、(8分) 定义一个字符栈类Stack(包括类的实现)。数据成员包括一个存放字符的数组stck[ ]和一个栈指针tos。栈数组的尺寸由常量SIZE确定。栈的基本操作为Push()和Pop()。 const int SIZE=27; class Stack { public:

Stack():tos(0){}; void Push(char ch); char Pop(); private:

char stck[SIZE]; int tos; };

void Stack::Push(char ch) {

if(tos==SIZE)

cout<<\ else{

stck[tos]=ch;tos++; } }

char Stack::Pop() {

if(tos==0){

cout<<\

return 0; } tos--;

return stck[tos]; }

六、(10分)完成下面的函数,对有n个元素的数组a,使数组元素按逆序排列。 void inverse(int *a, int n) { }

int i,*p; p=new int[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。请完成该函数。

int str_count(char *substr, char *str) { }

int count=0; char *pChar;

if(substr==NULL||str==NULL) return count; while(*str!='\\0'){ pChar=substr; while(*pChar==*str){ pChar++; if(*pChar=='\\0'){ count++;break; } else str++;

}//Match while(*pCh...) statement str++;

}//Match while(*str...) statement return count;