答案:A
解析:(P39)类即数据和操作的组合体,数据是类的静态特征,操作是类具有的动作。
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. 在下列成对的表达式中,运算结果类型相同的一对是() A. 7.0/2.0和7.0/2 B. 5/2.0和5/2 C. 7.0/2和7/2 D. 8/2和6.0/2.0 答案:A
解析:小数默认的类型为double类型,整数除以整数结果是取整的结果。A、B、C和D项的第一项分别是double、double、double和int类型的,第二项分别是double、int、int和double类型,所以选择A项。
8. 下列不具有访问权限属性的是() A. 非类成员 B. 类成员 C. 数据成员 D. 函数成员 答案:A
解析:类成员包括成员函数和数据成员,都可以使用访问权限public、private和protected来修
饰,而普通的变量不能使用访问权限来说明。 9. 以下有关继承的叙述正确的是 () A. 构造函数和析构函数都能被继承 B. 派生类是基类的组合
C. 派生类对象除了能访问自己的成员以外,不能访问基类中的所有成员 D. 基类的公有成员一定能被派生类的对象访问 答案:C
解析:(P129)构造函数和析构函数不能被派生类继承,A项错误。派生类是基类的扩展,B项错。
派生类可以访问基类公有和保护类型的成员,不能访问基类私有成员。D项基类是公有的成
员,若采用私有继承,派生类对象不能直接访问。选择C项。 10. 下列有关模板和继承的叙述正确的是 () A. 模板和继承都可以派生出一个类系
B. 从类系的成员看,模板类系的成员比继承类系的成员较为稳定 C. 从动态性能看, 继承类系比模板类系具有更多的动态特性
D. 相同类模板的不同实例一般没有联系,而派生类各种类之间有兄弟父子等关系 答案:D
解析:(P145)类是相同类型事物的抽象,具有不同的操作。而模板是不同类型的事物,具体相同的操作的抽象。类模板的实例化后,各个对象没有任何关系。而类对象是通过派生、继承等关系的关系。
11. 适宜采用inline定义函数情况是() A. 函数体含有循环语句 B. 函数体含有递归语句 C. 函数代码少、频繁调用 D. 函数代码多、不常调用 答案:C
解析:(P59)内联函数具有程序代码少、频繁调用和执行效率高的特征,所以选择C项。 12. 要采用动态多态性,说法正确的是() A. 基类指针调用虚函数 B. 派生类对象调用虚函数 C. 基类对象调用虚函数 D. 派生类指针调用虚函数 答案:A
解析:(P170)使用基类的指针或引用,由指向或引用的对象来决定调用不同类的虚函数。所以选择A。
13. C++类体系中,不能被派生类继承的有() A. 转换函数 B. 构造函数 C. 虚函数
D. 静态成员函数 答案:B
解析:(P127)构造函数不能被继承,而转换函数、虚函数和静态成员函数都可以被继承,所以选择B项。
14. 下列不是描述类的成员函数的是() A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数 答案:C
解析:(P109)构造函数、析构函数、拷贝构造函数都是特殊的成员函数,友元则不是成员函数。
所以选择C项。
15. 下列不能作为类的成员的是() A. 自身类对象的指针 B. 自身类对象
C. 自身类对象的引用 D. 另一个类的对象
答案:B
解析:类的定义,如果有自身类对象,使得循环定义,B项错误。在类中具有自身类的指针,可以实现链表的操作,当然也可以使用对象的引用。类中可以有另一个类的对象,即成员对象。所以选择B选项。
16. 下列不是描述类的成员函数的是() A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数 答案:C
解析:(P113)友元函数不是类成员,只是它可以访问类中的成员。 17. 关于对象概念的描述中,说法错误的是() A. 对象就是C语言中的结构变量
B. 对象代表着正在创建的系统中的一个实体 C. 对象是类的一个变量
D. 对象之间的信息传递是通过消息进行的 答案:A
解析:(P37)A对象在C++中才有,包括数据和操作两项,而C中的变量只有数据,没有操作。所以A项错误。
18. 派生类的构造函数的成员初始化列表中,不能包含() A. 基类的构造函数 B. 基类的对象初始化 C. 派生类对象的初始化
D. 派生类中一般数据成员的初始化 答案:C
解析:(P130)派生类的构造函数的成员初始化,包括基类成员、基类对象成员和派生类成员。因为本身就是初始化定义的对象,在构造函数中再进行该类对象的初始化产生了循环定义,或者类中不能包括本身类的成员对象。所以选择C项。 19. 关于new运算符的下列描述中,错误的是() A. 它可以用来动态创建对象和对象数组
B. 使用它创建的对象或对象数组可以使用运算符delete删除 C. 使用它创建对象时要调用构造函数 D. 使用它创建对象数组时必须指定初始值 答案:D
解析:(P78)new创建的对象数组不能指定初始值,所以调用无参的构造函数,选择D项。 20. 假定一个类的构造函数为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。 二、填空题
1. 在C++中,编译指令都是以___(符号)开始。 答案:#
C++的源程序可包括各种编译指令,以指示编译器对源代码进行编译之前先对其进行预处理。所
有的编译指令都以#开始,每条指令单独占用一行,同一行不能有其他编译指令和C++语句(注释例外)
2. 在函数前面用___保留字修饰时,则表示该函数表为内联函数。 答案:(P59)inline
[解析]内联函数,用来提高程序运行速度。在类内部定义的函数也是内联函数。 3. 执行下列程序 int a=21,j=16;