C++试题及答案 下载本文

D. 构造函数必须指定类型说明 答案:D

解析:构造函数无返回类型不能继承但可以重载,所以选择D项。

11. 在公有继承的情况下,基类的公有或保护成员在派生类中的访问权限() A. 受限制 B. 保持不变 C. 受保护 D. 不受保护 答案:B

解析:继承方式的不同派生类成员的权限也不同,采用公有继承,除了私有无法访问外 ,公有、保护在派生类中保持不变,所以选择B项。

12. 假定一个类的构造函数为A(int aa,int bb) {a=aa--;b=a*bb;},则执行A x(4,5);语句后 ,x.a和x.b的值分别为() A. 3和15 B. 5和4 C. 4和20 D. 20和5 答案:C

解析:a=4,因为后减,b的值与a、bb相关,b=4*5=20,而与aa没有任何关系。 13. C++对C语言做了很多改进,即从面向过程变成为面向对象的主要原因是() A. 增加了一些新的运算符

B. 允许函数重载,并允许设置缺省参数 C. 规定函数说明符必须用原型 D. 引进了类和对象的概念 答案:D

解析:C++是一面向对象的语言,面向对象的特征,抽象、多态、继承和封装。 14. 在类中说明的成员可以使用关键字的是() A. public B. extern C. cpu

D. register 答案:A

解析:extern用于声明外部变量的。register声明寄存器类型变量。无cpu类型。它们都不能声 明类成员。public声明为公有访问权限,所以选择A项。

15. C++语言中所有在函数中定义的变量,连同形式参数,都属于() A. 全局变量 B. 局部变量 C. 静态变量 D. 函数 答案:B

解析:变量存储类可分为两类:全局变量和局部变量。

(1)全局变量:在函数外部定义的变量称为全局变量,其作用域为:从定义变量的位置开始到 源程序结束。使用全局变量降低了程序的可理解性,软件工程学提倡尽量避免使用全局变量。 (2)局部变量:在函数内部定义的变量称为局部变量,其作用域为:从定义变量的位置开始到 函数结束。局部变量包含自动变量(auto)静态变量(static)以及函数参数。形参不能是静态 的。所以选择B项。

16. 在私有继承的情况下,基类成员在派生类中的访问权限() A. 受限制 B. 保持不变 C. 受保护 D. 不受保护 答案:A

解析:私有继承下,基类中的公有或保护成员在派生类中也是私有的,所以选择A选项。 17. 使用地址作为实参传给形参,下列说法正确的是() A. 实参是形参的备份 B. 实参与形参无联系 C. 形参是实参的备份 D. 实参与形参是同一对象 答案:D

解析:地址作为实参,表示实参与形参代表同一个对象。如果实参是数值,形参也是普通 变量,此时形参是实参的备份。所以选择D项。 18. C++的继承性允许派生类继承基类的()

A. 部分特性,并允许增加新的特性或重定义基类的特性 B. 部分特性,但不允许增加新的特性或重定义基类的特性 C. 所有特性,并允许增加新的特性或重定义基类的特性 D. 所有特性,但不允许增加新的特性或重定义基类的特性

答案:A

解析:派生类有两类成员:一是基类,二是自身类。派生类中的成员不能访问基类中的私 有成员,可以访问基类中的公有成员和保护成员。 19. 对于int *pa[5];的描述,正确的是()

A. pa是一个指向数组的指针,所指向的数组是5个int型元素

B. pa是一个指向某个数组中第5个元素的指针,该元素是int型变量 C. pa[5]表示某个数组的第5个元素的值

D. pa是一个具有5个元素的指针数组,每个元素是一个int型指针 答案:D

解析:指针数组:数组元素都是相同类型的指针,相同类型的指针是说指针所指向的对象

类型是相同的。例如,语句int *pa[5];定义了一个指针数组。在指针数组的定义中有两个运 算符:*和[],运算符[]的优先级高于*,所以*pa[5]等价于*(pa[5]),pa[5]表示一 个数组,而*表示后面的对象为指针变量,合在一起*pa[5]表示一个指针数组。该数组包含5个 元素,每个元素都是指向int型的指针。所以选择D选项。 20. 以下基类中的成员函数表示纯虚函数的是() A. virtual void tt()=0 B. void tt(int)=0

C. virtual void tt(int) D. virtual void tt(int){} 答案:A

解析:当在基类中不能为虚函数给出一个有意义的实现时,可以将其声明为纯虚函数,实 现由派生类完成。格式:virtual<函数返回类型说明符><函数名>(<参数表>)=0;。 二、填空题(本大题共20小题,每小题1分,共20分)请在每小题的空格中填上正确答 案。错填、不填均无分。

1. 单目运算符作为类成员函数重载时,形参个数为___个。 答案:0

[解析]单目运算符使用成员函数重载可以不用形参,双目运算符使用一个参数。 2. 抽象类中至少要有一个___函数。 答案:纯虚

[解析]至少有一个纯虚函数的类就称为抽象类,即不能实例化。

3. 设类A有成员函数void f(void);若要定义一个指向类成员函数的指针变量pf来指向f,该 指针变量的声明语句是:___。

答案:void (A::*pf)(void)=&A::f;

[解析]void(A::*pf)(void)=&A::f;指向成员函数的指针,它相当于两条语句 :void(A::*pf)(void);和pf=&A::f;。 4. 执行下列程序

double a=3.1415926,b=3.14;

cout<

[解析]题目设置精度即有效数字都是5,a四舍五入是3.1416,b是3.14。 5. vector类中用于删除向量中的所有对象的方法是___。 答案:clear()

[解析]向量的使用。返回向量中对象的方法有:front()back()operator[],在向量中删 除对象的方法pop_back erase clear。

6. 重载的运算符保持其原有的___、优先级和结合性不变。 答案:操作数

[解析]运算符重载时要遵循以下规则:

(1)除了类属关系运算符“.”、成员指针运算符“.*”、作用域运算符“::”、sizeof运算符 和三目运算符“?:”以外,C++中的所有运算符都可以重载。

(2)重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的 运算符。

(3)重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及 语法结构。

7. 编译时的多态性通过___函数实现。 答案:重载

[解析]编译多态性,实现的方法主要通过函数的重载或运算符的重载。 8. 基类的公有成员在派生类中的访问权限由___决定。 答案:访问控制方式或继承方式

9. 假设类X的对象x是类Y的成员对象,则“Y Obj”语句执行时,先调用类___的构造函数。 答案:X

[解析]派生类中的构造函数的执行顺序,先基类后派生类。 10. 下列程序段的输出结果是___。 cout.setf(ios::showpos); cout<<509.3<

[解析]输入、输出格式ios::showpos用于输出数据的符号位。

11. 下列程序段的输出结果是___。

for(i=0,j=10,k=0;i<=j;i++,j-=3,k=i+j);cout<

[解析]for循环结构,三个表达式的作用,初始化、循环判断条件和循环变量变化。循环执行了 三次,k的作用是计算i、j的和。

12. C++中ostream的直接基类___。 答案:ios

[解析]istream和ostream的直接基类是ios。 13. int n=0; while(n=1)n++;

while循环执行次数是___。 答案:无限次

[解析]=是赋值运算符,不是关系运算符,且不等0,所以死循环。 14. C++中有两种继承:单继承和___。 答案:多继承

[解析]单继承和多继承,多继承即有多个基类。

15. 在C++中,利用向量类模板定义一个具有10个int的向量A,其元素均被置为1,实现此操作 的语句是___。

答案:vectorA(10,1)

[解析]定义向量列表vectorA(10,1),使用两个参数,10表示长度,1表示数值。 16. vector类中向向量尾部插入一个对象的方法是___。 答案:push_back

17. C++语言中如果调用函数时,需要改变实参或者返回多个值,应该采取___方式。 答案:传地址或引用

[解析]传地址即指针,在函数中通过指针修改它指向的变量的值时,实参也就变化了。使用引 用,直接修改变量的别名即引用的值,该变量也就随着变化。

18. 若函数的定义处于调用它的函数之前,则在程序开始可以省去该函数的___语句。 答案:声明

[解析]函数使用有两部分:声明和定义。定义在前,可以无声明;但函数定义在后,调用在前 的话,需要先声明函数的原型。

19. 在C++中有两种参数传递方式:传值和___。 答案:传引用

[解析](1)传值调用又分为数据传值调用和地址传值调用。(2)引用调用是将实参变量值传 递给形参,而形参是实参变量的引用名。引用是给一个已有变量起的别名,对引用的操作就是对 该引用变量的操作。

20. 将指向对象的引用作为函数的形参,形参是对象的引用,实参是 ___。 答案:对象名

[解析]实参与形参类型要一致,形参是对象的引用,实参应该是对象名。 三、改错题(本大题共5小题,每小题4分,共20分) 1. class ABC {int a; public:

ABC(int aa)a(aa){} };

答案:ABC(int aa)a(aa){}初始化列表格式错误。 [修改]ABC(int aa):a(aa){} 2. #include class Aton {int X,Y; protected: int zx,zy; public:

void init(int i,int j){zx=i;zy=j;} Aton(int i,int j,int n=0,int m=0) {X=i,Y=j,zx=m,zy=n; } };

void main()

{Aton A(25,20,3,5); A.init(5,9);

cout<

答案:int X,Y;因为X,Y都是私有的,在类外无法直接访问。 [修改]public:int X,Y; 3. #include class Bas {public:

~Bas(){cout<<\

virtual void f()=0; };

class Dev:public Bas {public:

~Dev(){cout<<\virtual void f(){cout<<\};

void main()

{Bas *a=new Bas(); Dev p; a=&p; a->f(); }

答案:[修改]Bas *a;

[解析]Bas *a=new Bas();抽象类不能被实例化,但可以声明指针或引用,所以不能用new,因 为new产生临时对象。

4. 以下程序实现交换a,b变量的值,请用下横线标出错误所在行并给出修改意见。 #include void swap(int &a,int &b) {a=a+b; b=a-b; a=a-b; }

void main() {int a=19,b=15;

cout<<\swap(&a,&b);

cout<<\}

答案:swap(&a,&b);函数的形参是变量的引用,调用时的实参应该是地址。 [修改]swap(a, b);

5. #include void main() {int i(3),j(8); int * const p=&i; cout<<*p<

cout<<*p<

答案:int * const p=&i;在指针变量前加const表示一个常指针即地址不能变化,它指向的变 量不能改变且定义时必须设置指向变量或对象的地址。 [修改]int *p=&i;

四、完成程序题(本大题共5小题,每小题4分,共20分)

1. 在下面程序横线处填上适当内容,使程序执行结果为:\。 #include #include using namespace std; class mystring {public:

char * pdata; mystring(int len)

{pdata=new char[len+1]; }

~mystring() {delete pdata;}

void show(){cout<

void fun(mystring** array,int len) {mystring*old=*array; _______;

memcpy(*array, old, len); }

void main()

{mystring str(20); mystring*pstr=&str; mystring**ppstr=&pstr;

strcpy(str.pdata,\