admin 管理员组

文章数量: 887021


2023年12月24日发(作者:asp实验室)

C++考试试卷

得 分

一、单项选择(每空1分,共20分)

(注意选项填写到下面表格中!)

1 2 3 4 5 6 7

c

11

b

12

d

13

c

14

b

15

16

17

8

18

9

19

10

20

1. 已知:char *s="123456"; 则cout<

A) 123456 B) 3 C) 3456 D) 2

2. 已知:char *s="abcde"; 则sizeof(s)、sizeof(*s)、strlen(s)的值依次为( )。

A) 6 1 5 B) 4 1 5 C) 6 5 4 D) 4 4 5

3. 下列语句中正确的是( )。

A) char *s; *s="abcdefg";

B) char *s; cin>>s;

C) char *s1="abcd",*s2="efghijk";strcpy(s1,s2);

D) char *s="abcdefg"; cout<<*s;

4. C++中,关于构造函数和析构函数,正确的描述是( )。

A) 在定义类时,必须自定义构造函数和析构函数,在创建对象时自动调用构造函数,在释放对象时自动调用析构函数

B) 构造函数和析构函数均可以重载

C) 已知类Student以及Student *p; 在使用p=new Student;时自动调用无参构造函数创建动态对象,在delelte p;时自动调用析构函数释放动态对象

D) 构造函数和析构函数都可以成为虚函数

5. 关于拷贝构造函数的描述正确的是( )。

A) 通常的拷贝构造函数的参数是对象的指针类型

B) 如果不自定义拷贝构造函数,系统提供默认的拷贝构造函数

C) 如果有自定义的构造函数,系统就不再提供拷贝构造函数

D) 如果需要用已有对象为新创建的对象初始化时,就必须自定义拷贝构造函数

6. 有关静态成员的描述错误的是( )。

A) 某个类的静态数据成员由该类的所有对象所共享

B) 类的公有静态数据成员既可以用类的对象访问,也可以直接用作用域运算符“::”通过类名来访问

C) 静态数据成员既可以是私有成员,也可以是公有成员

D) 类中一旦定义了静态数据成员,就必须定义静态成员函数,以便对静态数据成员进行操作

7. 一个类的友元函数或友元类能够通过成员访问运算符访问该类的( )。

A) 所有成员 B) 私有成员 C) 保护成员 D) 公有成员

8. 下面关于继承方式的描述中错误的是( )。

A) 公有继承时,基类的公有成员和保护成员在派生类中都成为公有成员

B) 私有继承时,基类的公有成员和保护成员在派生类中都成为私有成员

C) 保护继承时,基类的公有成员和保护成员在派生类中都成为保护成员

D) 无论哪种继承方式,基类中的私有成员在派生类中都无法直接访问

9. 类型兼容是指在基类对象可以出现的地方,都可以使用公有派生类的对象,已知:

class BaseClass

{ //…};

class DerivedClass:public BaseClass

{ //…};

BaseClass b,*pb;

DerivedClass d,*pd;

下面不属于类型兼容的是( )。

A) b=d;

B) BaseClass &bb=d;

C) pd=&b;

D) pb=&d;

10. 在派生类中重新定义虚函数时,除了( ),其他方面都必须与基类中相应的虚函数保持一致。

A) 参数个数 B) 参数类型 C) 函数名称 D) 函数体

11. 下列运算符中,必须使用成员函数进行重载的是( )。

A) == B) = C) >> D) ++

12. 下列关于运算符重载的描述中,错误的是( )。

A) 运算符重载不可以改变优先级

B) 运算符重载不可以改变结合性

C) 运算符重载不可以改变运算符的操作数个数

D) 加法运算符“+”和赋值运算符“=”都重载之后,意味着“+=”也被重载了

13. 有关运算符重载的说法错误的是( )。

A) 在一个类中,可以对一个操作符进行多次重载

B) 重载赋值运算符“=”时,为了保持原有特性,重载运算符函数中应该使用返回语句“return

*this;”

C) C++中所有的运算符都可以被重载

D) 如果在某个类中使用成员函数对运算符重载,其左操作数必须是该类的对象

14. 已知某个类的友元函数重载了+=和-,a,b,c是该类的对象,则“a+=b-c”被C++编译器解释为( )。

A) operator+=(a,operator-(b,c))

B) or+=(or-(c))

C) operator+=(a,or-(c))

D) or+=(operator-(b,c))

15. 下面4个选项中,专门用于读取单个字符的是( )。

A) () B) () C) () D) e()

16. 下列关于getline( )函数的叙述中,错误的是( )。

A) getline( )函数仅用于从键盘而不能从文件读取字符串

B) getline( )函数读取字符串长度是受限制的

C) getline( )函数读取字符串时,遇到终止符就停止

D) getline( )函数中所使用的终止符默认是换行符,也可指定其他终止符

17. 打开文件的方式中,( )以追加方式打开文件。

A) ios::in B) ios::out C) ios::app D) ios::trunc

18. 当使用ofstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为( )。

A) ios:: out| ios::binary

B) ios::in| ios::binary

C) ios::out

D) ios::in

19. 有关函数模板和模板函数说法错误的是( )。

A) 函数模板只是对函数的描述,编译器不为其产生任何执行代码,所以它不是一个实实在在的函数

B) 模板函数是实实在在的函数,它由编译系统在遇到具体函数调用时所生成,并调用执行

C) 函数模板需要实例化为模板函数后才能执行

D) 当函数模板和一般函数同名时,系统先去匹配函数模板,将其实例化后进行调用

20.一个( )允许用户为类定义一种模式,使得类中的某些数据成员及某些成员函数的返回值能取任意类型。

A) 类模板 B) 模板类 C) 函数模板 D) 模板函数

得 分

二、判断题(每空1分,共20分)

注意:请将判断题结果(正确为T,错误为F)

填写到下面表格中!

1

11

2

12

3

13

4

14

5

15

6

16

7

17

8

18

9

19

10

20

1. 类定义中的成员默认的访问权限是private。

2. 一个类中的保护成员和公有成员类似,在程序的任何地方都可以被访问。

3. 系统提供的缺省构造函数没有参数,所以自定义构造函数必须带有参数。

4. 一旦自定义了构造函数,系统便不再提供缺省的构造函数。

5. 一个类只能有一个构造函数和一个析构函数。

6. 静态数据成员必须在类中进行定义和初始化。

7. 静态成员函数中不能访问非静态成员。

8. 重载插入运算符“<<”必须采用成员重载。

9. 如果类A是类B的友类,那么类A中的所有成员函数都可以访问类B中的所有成员。

10. 释放派生类的对象时,首先调用基类的析构函数,然后调用派生类的析构函数。

11. 拥有纯虚函数的类称为虚拟基类,它不能用来定义对象。

12. 虚函数只有在有继承的情况时才会存在。

13. 已知:class Base1{//…};

class Base2{//…};

class Derived:public Base1,public Base2

{ Derived():Base2(),Base1(){}

//…

};

创建Derived类的对象时,先调用Base2的构造函数,然后调用Base1的构造函数,最后调用Derived的构造函数。

14. 基类的指针或引用调用虚函数时采用后期绑定。

15. 由抽象基类继承得到的派生类肯定是具体类。

16. 友元函数内能够访问任何对象的任何成员。

17. 对二元运算符采用成员函数重载时,只需要一个参数,而且该参数可以是内部类型。

18. 对一元运算符采用某个类的友元函数重载时需要一个参数,参数为该类的对象,不能是其他类型。

19. C++的输入/输出流库中,ios类是一个虚基类,istream类、ostream类以及streambuf类都是ios类的派生类。

20. 设inf是一个ifstream类的流对象,则(10,ios::beg);表示将文件指针从文件当前位置向后移动10个字节。

得 分

三、读程序写结果(每空2分,共32分)

(注意将结果写在下面相应横线上!)

⑴ ⑵ ⑶ ⑷

⑸ ⑹ ⑺ ⑻

⑼ ⑽ ⑾_ ⑿

⒀ ⒁ ⒂ ⒃

1. 写出下面程序的运行结果。

#include

class A

{ public:

A( )

{ cout<<"A::A()called.n"; }

virtual ~A( )

{ cout<<"A::~A()called.n"; }

};

class B:public A

{ public:

B(int i)

{ cout<<"B::B()called.n";

buffer=new char[i]; }

virtual ~B( )

{ delete []buffer;

cout<<"B::~B()called.n"; }

private:

char* buffer;

};

void fun(A* a)

{ delete a; }

void main()

{ A *b=new B(10);

fun(b);

}

运行结果:

2. 写出下面程序的运行结果。

#include

class Shape

{

public:

void Draw()

{

cout<<"Shape"<

}

virtual void Print()=0;

};

class Circle:public Shape

{

private:

double r;

public:

void Draw()

{

cout<<"Circle"<

}

void SetData(double radius)

{

r=radius;

}

void Print()

{

cout<<"area:"<<3.14*r*r<

}

};

class Rectangle:public Shape

{

private:

double a,b;

public:

void Draw()

{

cout<<"Rectangle"<

}

void SetData(double x,double y)

{

a=x,b=y;

}

void Print()

{

cout<<"area:"<

}

};

void main()

{

Circle c;

Rectangle r;

Shape *sp1=&c;

Shape &sp2=r;

a(10);

a(3,5);

sp1->Draw();

();

();

();

}

运行结果:

3. 写出下面程序的运行结果(注:运行结果中首行的空白行不考虑)。

#include

class CArray

{ public:

CArray(int i)

{ Length=i;

Buffer=new char[Length+1]; }

~CArray()

{ delete []Buffer; }

int GetLength()

{ return Length; }

char& operator[](int i);

private:

int Length;

char* Buffer;

};

char& CArray::operator[](int i)

{ static char ch;

if(i=0)

return Buffer[i];

else

{ cout<<"nIndex out of range.";

return ch; }

}

void main()

{ int cnt;

CArray string1(6);

char *string2="Nankai";

for(cnt=0;cnt<8;cnt++)

string1[cnt]=string2[cnt];

cout<

for(cnt=0;cnt<8;cnt++)

cout<

cout<<"n";

cout<

}

运行结果:

4. 写出下面程序的运行结果。

#include

void fun(char *s)

{

int n=0;

while(s[n]!='0')

n++;

char t,*p=s+n-1;

while(s

{

t=*s;

*s=*p;

*p=t;

s++;

p--;

}

}

void main()

{

char str[]="abcdefg";

fun(str);

cout<

fun(str+1);

cout<

}

运行结果:

得 分

四、程序填空(每空2分,共28分)

(注意将结果写在下面相应横线上!)

⑴ ⑵ ⑶

⑷ ⑸

⑹ ⑺ ⑻

⑼ ⑽ ⑾

⑿ ⒀ ⒁

1. 下面的程序是一个类模板,可实现求三个变量的和,请将程序补充完整。

# include

class ff

{ Type a1, a2, a3;

public:

{ a1=b1; a2=b2; a3=b3; }

{ return a1+a2+a3; }

};

void main()

{ ff x(12,13,14), y(16,17,18);

cout<<( )<<" "<<( )<

}

2. 下面的程序将一个普通函数作为类的友元函数,求坐标点之和,并且程序输出结果为2,2,4,请将程序补充完整。

#include

class Point

{

int X,Y;

public:

{ X=x; Y=y; Countp++; }

Point(Point &p)

{ X=p.X; Y=p.Y; Countp++; }

~Point()

{ Countp--; }

static int Countp;

void display(){cout<

};

Point myfun(Point p1, Point p2, Point p3)

{ Point tmp(p1.X+p2.X+p3.X, p1.Y+p2.Y+p3.Y);

}

void main()

{ Point pp0,pp1(1,2),pp2(1);

Point p=myfun(pp0,pp1,pp2);

y ();

cout<< ⑻ <

}

3. 下面的程序将一个已有文件的内容复制到另一个文件中。请将程序补充完整。

#include

#include

#include

void main( )

{ ⑼

("d:",ios::in);

if(!infile)

{ cout<<" can't open.n";

abort(); }

("d:",ios::out);

if(!outfile)

{ cout<<" can't open.n";

abort(); }

char str[80]="0";

while(!())

{ (str,sizeof(str));

cout<

}

cout<

();

}

4. ARRAY类的定义如下,构造函数把参数n的值赋给s,给v动态分配长度为n的数组空间,然后利用数组参数a初始化v所指向的数组。请将类定义补充完整。

class ARRAY

{ int *v;

int s;

public:

ARRAY( int a[], int n );

~ARRAY( )

{ delete []v; }

int size()

{ return s; }

int& operator[](int n);

};

⑿ ARRAY(int a[], int n)

{ if( n<=0 )

{ v=NULL; s=0; return; }

s=n;

v= ⒀

for(int i=0; i

}

答案

一、单项选择(每空1分,共20分)

1

C

11

B

2

B

12

D

3

D

13

C

4

C

14

A

5

B

15

B

6

D

16

A

7

A

17

C

8

A

18

C

9

C

19

D

10

D

20

A

二、判断题(每空1分,共20分)(正确为T,错误为F)

1

T

11

F

2

F

12

T

3

F

13

F

4

T

14

T

5

F

15

F

6

F

16

F

7

T

17

T

8

F

18

T

9

T

19

F

10

F

20

F

三、读程序写结果(每空2分,共32分)

⑴ A::A()called. ⑵ B::B()called. ⑶ B::~B()called. ⑷ A::~A()called.

⑸ Shape ⑹ area:314 ⑺ Shape ⑻ area:15

⑼ Index out of range. ⑽ Index out of range. ⑾ Nankai ⑿ Index out of

range.

⒀ Index out of range. ⒁ 6 ⒂ gfedcba ⒃ gabcdef

四、程序填空(每空2分,共28分)

⑴ template ⑵ ff(Type b1, Type b2, Type b3) ⑶ Type sum()

⑷ Point(int x=0, int y=0) ⑸ friend Point myfun(Point p1, Point

p2, Point

p3);

⑹ return tmp; ⑺ int Point::Countp=0; ⑻ Point::Countp or

……

⑼ fstream infile, outfile; ⑽ (str,sizeof(str)); ⑾ ();

⑿ ARRAY:: ⒀ new int[n]; ⒁ v[i]=a[i]; or *(v+i)=*(a+i);

注:第1空class也可写为typename ;第5空中p1 p2 p3可缺省;第10空,如果写成(str,strlen(str));由于没有头文件string.h,应该算错;但如果写成outfile<


本文标签: 函数 成员 重载 运算符