C++程序设计模拟试卷(四)
一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中
只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无
分。
1. 当一个类的某个函数被说明为virtual时,该函数在该类的所有派生类中()
A. 都是虚函数
B. 只有被重新说明时才是虚函数
C. 只有被重新说明为virtual时才是虚函数
D. 都不是虚函数
答案:A
解析:(P170)在基类声明为virtual的函数为虚函数,在派生类中只要有相同的函数(函数名相
同、返回值相同、形参类型和个数相同)即使不用virtual说明,也都是虚函数。
2. 要禁止修改指针p本身,又要禁止修改p所指向的数据,这样的指针应定义为()
A. const char *p=“ABCD”;
B. char *const p=“ABCD”;
C. char const *p=“ABCD”;
D. const char * const p=“ABCD”;
答案:D
解析:(P12)const char *p说明禁止通过p修改所指向的数据。char * const p则说明不能修改析构方法
指针p的地址。因此const char * const p=“ABCD”;它禁止修改指针p本身,又禁止修改p所指
向的数据。
3. 函数调用func((exp1,exp2),(exp3,exp4,exp5))中所含实参的个数为()
A. 1
B. 2
C. 4
D. 5
答案:B
解析:(exp1,exp2)、(exp3,exp4,exp5)表示是两个逗号表达式,值是最后一个值,相当于两个
参数。因此实参的个数是2。
4. 设有函数模板
template <class Q>
Q Sum(Q x,Q y)
{return (x)+(y);}
则下列语句中对该函数模板错误的使用是()
A. Sum(10,2);
B. Sum(5.0,6.7);
C. Sum(15.2f,16.0f);
D. Sum(“AB”,”CD”);
答案:D
解析:(P40)由Q Sum(Q x,Q y)可知形参和函数返回值都是同一种数据类型。A、B、C三项都正确
。而D项用字符串作为实参,字符串的操作与数值类型不同,要用特殊方法进行字符串的连
接和
运算。
5. 类B是类A的公有派生类,类A和类B中都定义了虚函数func(),p是一个指向类A对象的指针
,则p->A::func()将()
A. 调用类A中的函数func()
B. 调用类B中的函数func()
C. 根据p所指的对象类型而确定调用类A中或类B中的函数func()
D. 既调用类A中函数,也调用类B中的函数
答案:A
解析:(P117)指向类成员指针的使用,A::func()是明确调用A类的func函数,所以不管p指向基
类或者派生类对象,都执行基类虚函数。注意p->A::func()和p->fun();进行区分。如果使用p-
>fun(),因为p指向派生类对象,由动态多态性可知要调用派生类的虚函数。
6. 在面向对象的程序设计中,首先在问题域中识别出若干个 ()
A. 函数
B.
C. 文件
D. 过程
答案:B
解析:(P31)面向过程的和面向对象都具有、函数、文件和过程这些概念,而面向对象程序才有
类和对象的特征。所以选择B。
7. 已知f1和f2是同一类的两个成员函数,但f1不能直接调用f2,这说明()
A. f1和f2都是静态函数
B. f1不是静态函数,f2是静态函数
C. f1是静态函数,f2不是静态函数
D. f1和f2都不是静态函数
答案:C
解析:(P107)普通成员函数可以调用静态函数,相反静态函数不能调用普通成员函数,这与普通
函数与常成员函数相同。因此选择C项。
8. 下列有关模板和继承的叙述正确的是 ()
A. 模板和继承都可以派生出一个类系
B. 从类系的成员看,模板类系的成员比继承类系的成员较为稳定
C. 从动态性能看, 继承类系比模板类系具有更多的动态特性
D. 相同类模板的不同实例一般没有联系,而派生类各种类之间有兄弟父子等关系
答案:D
解析:(P145)类是相同类型事物的抽象,具有不同的操作。而模板是不同类型的事物,具体相同
的操作的抽象。类模板的实例化后,各个对象没有任何关系。而类对象是通过派生、继承等关系
的关系。
9. 有关C++编译指令,以下叙述正确的是()
A. C++每行可以写多条编译指令
B. #include指令中的文件名可含有路径信息
C. C++的编译指令可以以#或//开始
D. C++中不管#if后的常量表达式是否为真,该部分都需要编译
答案:B
解析:(P96)编译指令以#作为开头,只能一行写一条,#if有选择进行编译,所以选择B项。
10. 在C++中不返回任何类型的函数应该说明为()
A. int
B. char
C. void
D. double
答案:C
解析:无形参或无返回值都可以用void来声明,int char double分别是整型、字符型和实型。
11. 若Sample类中的一个成员函数说明如下:
void set(Sample& a),则Sample& a的含义是()
A. 指向类Sample的名为a的指针
B. a是类Sample的对象引用,用来作函数Set()的形参
C. 将a的地址赋给变量Set
D. 变量Sample与a按位与的结果作为函数Set的参数
答案:B
解析:(P53)成员函数使用对象的引用作为形参。该函数的功能是将已知对象的所有数据成员的
值拷贝给相应对象的所有数据成员,不会建立临时对象,这里是对象的引用所以选择B。
12. 下列关于静态数据成员的描述中正确的是()
A. 静态数据成员是类的所有对象所共有的
B. 静态数据成员要在构造函数内初始化
C. 类的每个对象有自己的静态数据成员
D. 静态数据成员不能通过类的对象调用
答案:D
解析:(P107)静态成员属于类的即所有对象所共享的,只能在外部进行初始化。使用时可以使用
形式有两种,类名::静态成员或者对象.静态成员。所以选择D项。
13. 在编译指令中,宏定义使用哪个指令()
A. #if
B. #include
C. #define
D. #error
答案:C
解析:(P7)#if条件编译,#include文件包含,#error错误处理。
14. 类的析构函数是对一个对象进行以下哪种操作时自动调用的是()
A. 建立
B. 撤销
C. 赋值
D. 引用
答案:B
解析:(P80)删除对象或结束程序时,自动调用析构函数。
15. 关于new运算符的下列描述中,错误的是()
A. 它可以用来动态创建对象和对象数组
B. 使用它创建的对象或对象数组可以使用运算符delete删除
C. 使用它创建对象时要调用构造函数
D. 使用它创建对象数组时必须指定初始值
答案:D
解析:(P107)静态成员的特性是静态成员只有一个拷贝(副本),这个副本被所有属于这个类的
对象共享。这种共享与全局变量或全局函数相比,既没有破坏数据隐藏的原则,又保证了安
全性
。静态成员表示整个类范围的信息,其声明以关键字static开始,包括静态数据成员和静态成员
函数。在对静态数据成员初始化时应注意:
(1)应在类体外对静态数据成员进行初始化(静态数据成员的初始化与它的访问控制权限无关
)。
(2)静态数据成员初始化时前面不加static关键字,以免与一般静态变量或对象混淆。
(3)由于静态数据成员是类的成员,因此在初始化时必须使用作用域运算符(::)限定它所属的
类。因此选择D项。
16. 如果类A被说明成类B的友元,则()
A. 类B不一定是类A的友元
B. 类B的成员即类A的成员
C. 类A的成员即类B的成员
D. 类A的成员函数不得访问类B的成员
答案:A
解析:(P113)友元关系不能被继承,友元关系是单向的,友元关系不具有传递性。但是友元函数
不是类的成员,所以选择A项。
17. 假定一个类的构造函数为A(int aa,int bb){a=aa++;b=a*++bb;},则执行A x(4,5);语句
后,x.a和x.b的值分别为()
A. 4和5
B. 4和20
C. 4和24
D. 20和5
答案:C
解析:(P75)执行构造函数将数据成员进行赋值,aa++是后加,先赋值a=4,++bb,bb变量值先自
加为6,再与a相乘,所以b=24。
18. 下列运算符中,在C++语言中不能重载的是()
A. *
B. >=
C. ::
D. /
答案:C
解析:(P186)除了类属关系运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算
符和三目运算符"?:"以外,C++中的所有运算符都可以重载。
19. C++语言建立类族是通过()
A. 类的嵌套
B. 类的继承
C. 虚函数
D. 抽象类
答案:B
解析:(P174)类族即同一个类派生出来的类,各个类是兄弟或父子关系。
20. 在C++语言中,数据封装要解决的问题是()
A. 数据的规范化
B. 便于数据转换
C. 避免数据丢失
D. 防止不同模块之间数据的非法访问
答案:D
解析:(P39)封装是指把对象属性和操作结合在一起,构成独立的单元,它的内部信息对外界是
隐蔽的,不允许外界直接存取对象的属性,只能通过有限的接口与对象发生联系。类是数据封装
的工具,对象是封装的实现。类的访问控制机制体现在类的成员中可以有公有成员、私有成员和
保护成员。对于外界而言,只需要知道对象所表现的外部行为,而不必了解内部实现细节。封装
体现了面向对象方法的“信息隐蔽和局部化原则”。
二、填空题(本大题共20小题,每小题1分,共20分)请在每小题的空格中填上正确答案
。错填、不填均无分。
1. 若要使用string类,需要引入的头文件是___。
答案:(P40)string.h
[解析]编译时要将头文件引入才能使用标准库中的方法或成员。
2. 在函数前面用___保留字修饰时,则表示该函数表为内联函数。
答案:(P59)inline
[解析]内联函数,用来提高程序运行速度。在类内部定义的函数也是内联函数。