1、C+程序设计模拟试卷(一)一、单项选择题1. 编写C+程序一般需经过的几个步骤依次是()A. 编辑、调试、编译、连接B. 编辑、编译、连接、运行C. 编译、调试、编辑、连接D. 编译、编辑、连接、运行答案:B解析:(P21)经过编辑、编译、连接和运行四个步骤。编辑是将C+源程序输入计算机的过程,保存文件名为cpp。编译是使用系统提供的编译器将源程序cpp生成机器语言的过程,目标文件为obj,由于没有得到系统分配的绝对地址,还不能直接运行。连接是将目标文件obj转换为可执行程序的过程,结果为exe。运行是执行exe,在屏幕上显示结果的过程。2. 决定C+语言中函数的返回值类型的是()A. ret
2、urn语句中的表达式类型B. 调用该函数时系统随机产生的类型C. 调用该函数时的主调用函数类型D. 在定义该函数时所指定的数据类型答案:D解析:(P51)函数的返回值类型由定义函数时的指定的数据类型决定的。A项的表达式的值要转换成函数的定义时的返回类型。3. 下面叙述不正确的是()A. 派生类一般都用公有派生B. 对基类成员的访问必须是无二义性的C. 赋值兼容规则也适用于多重继承的组合D. 基类的公有成员在派生类中仍然是公有的答案:D解析:(P136)继承方式有三种:公有、私有和保护。多继承中,多个基类具有同名成员,在它们的子类中访问这些成员,就产生了二义性,但进行访问时,不能存在二义性。赋值
3、兼容规则是指派生类对象可以当作基类对象使用,只要存在继承关系,所以单继承或多继承都适用。基类中的公有成员采用私有继承时,在派生类中变成了私有成员,所以D项错误。4. 所谓数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是()A. 类B. 对象C. 函数体D. 数据块答案:A解析:(P39)类即数据和操作的组合体,数据是类的静态特征,操作是类具有的动作。5. 在公有派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的()A. 私有成员B. 公有成员C. 保护成员D. 保护成员或私有成员答案:A解析:(P133)在派生类中基类的保护或者基类公有都
4、可以直接访问,基类的私有成员只能是基类的成员函数来访问。所以选择A项。6. 对基类和派生类的关系描述中,错误的是()A. 派生类是基类的具体化B. 基类继承了派生类的属性C. 派生类是基类定义的延续D. 派生类是基类的特殊化答案:B解析:(P129)派生类的成员一个是来自基类,一个来自本身,所以派生类是基类的扩展,也是基类的具体化和特殊化,派生类是对基类扩展。B项基类不能继承派生类成员,所以错误。7. 关于this指针使用说法正确的是()A. 保证每个对象拥有自己的数据成员,但共享处理这些数据的代码B. 保证基类私有成员在子类中可以被访问。C. 保证基类保护成员在子类中可以被访问。D. 保证基
5、类公有成员在子类中可以被访问。答案:A解析:(P86)this指针是隐藏的,可以使用该指针来访问调用对象中的数据。基类的成员在派生类中能否访问,与继承方式有关,与this没有关系。所以选择A项。8. 所谓多态性是指 ()A. 不同的对象调用不同名称的函数B. 不同的对象调用相同名称的函数C. 一个对象调用不同名称的函数D. 一个对象调用不同名称的对象答案:B解析:(P167)多态性有两种静态多态性和动态多态性,静态多态性是指调用同名函数,由于参数的不同调用不同的同名函数;动态多态性是指不同对象调用同名函数时,由于对象不同调用不同的同名函数。 多态性肯定具有相同的函数名,所以选择B项。9. 一个
6、函数功能不太复杂,但要求被频繁调用,则应把它定义为 ()A. 内联函数B. 重载函数C. 递归函数D. 嵌套函数答案:A解析:(P59)内联函数特征代码少,频繁调用,执行效率高。重载函数解决统一接口的问题;递归是子程序调用,程序调用要耗费很多空间和时间,循环/迭代都比递归有效率得多,递归只是从形式上,逻辑比较简洁。嵌套函数即反复调用,速度较慢。所以选择A项。10. 下面函数模板定义中不正确的是()A. AB. BC. CD. D答案:A解析:(P147)A项中F是一个返回Q类型的值,而return中用返回类型作为返回值错误。所以选择A项。11. 假设ClassY:publicX,即类Y是类X的
7、派生类,则说明一个Y类的对象时和删除Y类对象时,调用构造函数和析构函数的次序分别为()A. X,Y;Y,XB. X,Y;X,YC. Y,X;X,YD. Y,X;Y,X答案:A解析:(P130)派生类构造函数必须对这三类成员进行初始化,其执行顺序:调用基类构造函数;调用子对象的构造函数;派生类的构造函数体。析构函数在执行过程中也要对基类和成员对象进行操作,但它的执行过程与构造函数正好相反,即对派生类新增普通成员进行清理;调用成员对象析构函数,对派生类新增的成员对象进行清理;调用基类析构函数,对基类进行清理,所以选择A项。12. 适宜采用inline定义函数情况是()A. 函数体含有循环语句B.
8、函数体含有递归语句C. 函数代码少、频繁调用D. 函数代码多、不常调用答案:C解析:(P59)内联函数具有程序代码少、频繁调用和执行效率高的特征,所以选择C项。13. 假定一个类的构造函数为A(int aa,int bb) a=aa-;b=a*bb;,则执行A x(4,5);语句后,x.a和x.b的值分别为()A. 3和15B. 5和4C. 4和20D. 20和5答案:C解析:(P75)a=4,因为后减,b的值与a、bb相关,b4*5=20,而与aa没有任何关系。14. 在类中说明的成员可以使用关键字的是()A. publicB. externC. cpuD. register答案:A解析:e
9、xtern用于声明外部变量的。register声明寄存器类型变量。无cpu类型。它们都不能声明类成员。public声明为公有访问权限,所以选择A项。15. 下列不能作为类的成员的是()A. 自身类对象的指针B. 自身类对象C. 自身类对象的引用D. 另一个类的对象答案:B解析:类的定义,如果有自身类对象,使得循环定义,B项错误。在类中具有自身类的指针,可以实现链表的操作,当然也可以使用对象的引用。类中可以有另一个类的对象,即成员对象。所以选择B选项。16. 使用地址作为实参传给形参,下列说法正确的是()A. 实参是形参的备份B. 实参与形参无联系C. 形参是实参的备份D. 实参与形参是同一对象
10、答案:D解析:(P51)地址作为实参,表示实参与形参代表同一个对象。如果实参是数值,形参也是普通变量,此时形参是实参的备份。所以选择D项。17. 下列程序的输出结果是()#include void main()int n3=10,20,30,40,50,60;int (*p)3;p=n;cout。p表示指向数组n的行指针。如果将指针的初始化(*p)3=b;地址的等价形式:p+i pi*(p+i)都表示b数组第i+1行的第1个元素的首地址。*(p+i)+jpi+j 解析new用来动态开辟空间。常用来产生动态数组及对象构造函数。4. 函数模板中紧随template之后尖括号内的类型参数都要冠以保留
11、字_。答案:(P145)class解析类模板的使用。template ,也可以引入多参数的如:template 5. 定义类的动态对象数组时,系统只能够自动调用该类的_构造函数对其进行初始化。答案:(P80)无参解析使用new创建对象数组,调用无参构造函数。6. 表达式cout解析指针使用成员有两种方法:“-”指向运算符和“.”成员访问运算符。8. 假如一个类的名称为MyClass,使用这个类的一个对象初始化该类的另一个对象时,可以调用_构造函数来完成此功能。答案:(P80)复制或拷贝复制或拷贝构造函数就是用对象初始化新的对象。9. 对赋值运算符进行重载时,应声明为_函数。答案:(P183)类
12、成员解析运算符重载的方法有友元或者成员函数两种途径,但是赋值运算符只能使用成员函数的方法来实现。10. 如果要把A类成员函数f()且返回值为void声明为类B的友元函数,则应在类B的定义中加入的语句_。答案:(P109)friend void A:f();解析成员函数作为另一个类的友元函数,格式为:friend 返回类型 类名:函数(形参)。11. 下列程序段的输出结果是_。for(i=0,j=10,k=0;iV2(V1);解析采用向量初始化另一个向量的形式:vector name1(name);一、单项选择题1. 静态成员函数没有()A. 返回值B. this指针C. 指针参数D. 返回类型
13、答案:B解析:(P107)静态成员函数是普通的函数前加入static,它具有函数的所有的特征:返回类型、形参,所以使用(P107)静态成员函数,指针可以作为形参,也具有返回值。静态成员是类具有的属性,不是对象的特征,而this表示的是隐藏的对象的指针,因此静态成员函数没有this 指针。静态成员函数当在类外定义时,要注意不能使用static关键字作为前缀。由于静态成员函数在类中只有一个拷贝(副本),因此它访问对象的成员时要受到一些限制:静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员;若要访问非静态成员时,必须通过参数传递的方式得到相应的对象,再通过对象来访问。2
14、. 假定AB为一个类,则执行“AB a(2), b3,*p4;”语句时调用该类构造函数的次数为()A. 3B. 4C. 5D. 9答案:B解析:(P79)a(2)调用1次带参数的构造函数,b3调用3次无参数的构造函数,指针没有给它分配空间,没有调用构造函数。所以共调用构造函数的次数为4。3. 有关多态性说法不正确的是()A. C+语言的多态性分为编译时的多态性和运行时的多态性B. 编译时的多态性可通过函数重载实现C. 运行时的多态性可通过模板和虚函数实现D. 实现运行时多态性的机制称为动态多态性答案:C解析:(P171)多态性分为静态的和动态的。静态通过函数的重载来实现,动态是通过基类指针或基
15、类引用和虚函数来实现的。所以错误的是C项。4. 假定一个类的构造函数为“A(int i=4, int j=0) a=i;b=j;”, 则执行“A x (1);”语句后,x.a和x.b的值分别为()A. 1和0B. 1和4C. 4和0D. 4和1答案:A解析:(P75)带默认的构造函数,对应实参没有值时就采用形参值。调用构造函数时,i=1,不采用默认值,而只有一个参数,j采用默认值0即j=0,因此a=1,b=0,选择A项。5. 类MyA的拷贝初始化构造函数是 ()A. MyA()B. MyA(MyA*)C. MyA(MyAB. A1-p=5;C. A1.*p=5;D. *A1.p=5;答案:C解
16、析:(P118)A中p是指针即地址,错误;B选项中A1不是指针不能使用指向运算符-,错误;“*”比“.”级别要高,所以D选项*A1.p=5相当于(*A1).p=5;错误。另外涉及到指向成员函数时注意以下几点:指向成员函数的指针必须于其赋值的函数类型匹配的三个方面:(1)参数类型和个数;(2)返回类型;(3)它所属的类类型。成员函数指针的声明:指向short型的Screen类的成员的指针定义如下:short Screen:* ps_Screen;ps_Screen可以用_height的地址初始化如下:short Screen:*ps_Screen=类成员的指针必须总是通过特定的对象或指向改类型的
17、对象的指针来访问。是通过使用两个指向成员操作符的指针(针对类对象和引用的.*,以及针对指向类对象的指针的-*)。18. 以下基类中的成员函数表示纯虚函数的是()A. virtual void tt()=0B. void tt(int)=0C. virtual void tt(int)D. virtual void tt(int)答案:A解析:(P173)当在基类中不能为虚函数给出一个有意义的实现时,可以将其声明为纯虚函数,实现由派生类完成。格式:virtual()=0;。19. C+类体系中,不能被派生类继承的有()A. 常成员函数B. 构造函数C. 虚函数D. 静态成员函数答案:B解析:(P
18、132)构造函数不能被继承。20. 静态成员函数不能说明为()A. 整型函数B. 浮点函数C. 虚函数D. 字符型函数答案:C解析:(P108)使用关键字static声明的成员函数就是静态成员函数,静态成员函数也属于整个类而不属于类中的某个对象,它是该类的所有对象共享的成员函数。静态成员函数可以在类体内定义,也可以在类外定义。当在类外定义时,要注意不能使用static关键字作为前缀。由于静态成员函数在类中只有一个拷贝(副本),因此它访问对象的成员时要受到一些限制:静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员;若要访问非静态成员时,必须通过参数传递的方式得到相应
19、的对象,再通过对象来访问。虚函数是非静态的、非内联的成员函数。静态成员函数不能被说明为虚函数。二、填空题1. 假设int a=1,b=2;则表达式(+a/b)*b-的值为_。答案:2解析前缀或表示先使变量值变化,再使用,这和后缀恰恰相反。但是编译coutvoid main()int num=2,i=6;doi-;num+;while(-i);coutnew;其中,可以是基本数据类型,也可以是由基本类型派生出来的类型;取得分配到的内存首地址。new有3种使用形式。(1)给单个对象申请分配内存int *ip;ip=new int;/ip指向1个未初始化的int型对象(2)给单个对象申请分配内存的同
20、时初始化该对象int *ip;ip=new int(68);/ip指向1个表示为68的int型对象(3)同时给多个对象申请分配内存int *ip;ip=new int5;/ip指向5个未初始化的int型对象的首地址for(int i=0;i()const;常成员函数不更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。常对象只能调用它的常成员函数,而不能调用其他成员函数。const关键字可以用于参与重载函数的区分。8. 在C+程序设计中,建立继承关系倒挂的树应使用_继承。答案:(P138)单解析一个基类可以派生多个子类,一个子类可以再派生出多个子类,这样就形成了一个倒立的树。9
21、. 基类的公有成员在派生类中的访问权限由_决定。答案:(P132)访问控制方式或继承方式10. 不同对象可以调用相同名称的函数,但执行完全不同行为的现象称为_。答案:(P167)多态性解析多态性的概念。虚函数是实现多态的基础,运行过程中的多态需要同时满足3个条件:(1)类之间应满足子类型关系。(2)必须要有声明的虚函数。(3)调用虚函数操作的是指向对象的指针或者对象引用;或者是由成员函数调用虚函数(如果是在构造函数或析构函数中调用虚函数,则采用静态联编)。11. this指针始终指向调用成员函数的_。答案:对象this指针是隐藏的指针,它指向调用函数的对象。12. 预处理命令以_符号开头。答案
22、:(P183)operater解析文件包含、预处理和编译都是以开头。13. 类模板用来表达具有_的模板类对象集。答案:(P145)相同处理方法解析模板特点是不同的数据具有相同的处理方法的抽象。14. C+程序的源文件扩展名为_。答案:(P21)cpp解析源程序*.cpp,目标文件为*.obj,可执行程序*.exe。15. 在#include命令中所包含的头文件,可以是系统定义的头文件,也可以是_的头文件。答案:(P7)自定义解析include装入文件有两种方式A:func()将()A. 调用类A中的函数func()B. 调用类B中的函数func()C. 根据p所指的对象类型而确定调用类A中或类
23、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是同一类的
24、两个成员函数,但f1不能直接调用f2,这说明()A. f1和f2都是静态函数B. f1不是静态函数,f2是静态函数C. f1是静态函数,f2不是静态函数D. f1和f2都不是静态函数答案:C解析:(P107)普通成员函数可以调用静态函数,相反静态函数不能调用普通成员函数,这与普通函数与常成员函数相同。因此选择C项。8. 下列有关模板和继承的叙述正确的是 ()A. 模板和继承都可以派生出一个类系B. 从类系的成员看,模板类系的成员比继承类系的成员较为稳定C. 从动态性能看, 继承类系比模板类系具有更多的动态特性D. 相同类模板的不同实例一般没有联系,而派生类各种类之间有兄弟父子等关系答案:D解析
25、:(P145)类是相同类型事物的抽象,具有不同的操作。而模板是不同类型的事物,具体相同的操作的抽象。类模板的实例化后,各个对象没有任何关系。而类对象是通过派生、继承等关系的关系。9. 有关C+编译指令,以下叙述正确的是()A. C+每行可以写多条编译指令B. #include指令中的文件名可含有路径信息C. C+的编译指令可以以#或/开始D. C+中不管if后的常量表达式是否为真,该部分都需要编译答案:B解析:(P96)编译指令以作为开头,只能一行写一条,if有选择进行编译,所以选择B项。10. 在C+中不返回任何类型的函数应该说明为()A. intB. charC. voidD. doubl
26、e答案:C解析:无形参或无返回值都可以用void来声明,int char double分别是整型、字符型和实型。11. 若Sample类中的一个成员函数说明如下:void set(Sampleb=a*+bb;,则执行A x(4,5);语句后,x.a和x.b的值分别为()A. 4和5B. 4和20C. 4和24D. 20和5答案:C解析:(P75)执行构造函数将数据成员进行赋值,aa+是后加,先赋值a4,+bb,bb变量值先自加为6,再与a相乘,所以b24。18. 下列运算符中,在C+语言中不能重载的是()A. *B. =C. :D. /答案:C解析:(P186)除了类属关系运算符“.“、成员指
27、针运算符“.*“、作用域运算符“:“、sizeof运算符和三目运算符“?:“以外,C+中的所有运算符都可以重载。19. C+语言建立类族是通过()A. 类的嵌套B. 类的继承C. 虚函数D. 抽象类答案:B解析:(P174)类族即同一个类派生出来的类,各个类是兄弟或父子关系。20. 在C+语言中,数据封装要解决的问题是()A. 数据的规范化B. 便于数据转换C. 避免数据丢失D. 防止不同模块之间数据的非法访问答案:D解析:(P39)封装是指把对象属性和操作结合在一起,构成独立的单元,它的内部信息对外界是隐蔽的,不允许外界直接存取对象的属性,只能通过有限的接口与对象发生联系。类是数据封装的工具
28、,对象是封装的实现。类的访问控制机制体现在类的成员中可以有公有成员、私有成员和保护成员。对于外界而言,只需要知道对象所表现的外部行为,而不必了解内部实现细节。封装体现了面向对象方法的“信息隐蔽和局部化原则”。二、填空题1. 若要使用string类,需要引入的头文件是_。答案:(P40)string.h解析编译时要将头文件引入才能使用标准库中的方法或成员。2. 在函数前面用_保留字修饰时,则表示该函数表为内联函数。答案:(P59)inline解析内联函数,用来提高程序运行速度。在类内部定义的函数也是内联函数。3. 向量操作方法中_方法返回向量中的第一个对象。答案:(P151)front解析考察向
29、量方法的使用。front():返回向量中的第1个对象。back():返回向量中的最后一个对象。operator(size_type,n):返回向量中的第n1个对象(下标为n的向量元素)。4. C+派生类使用两种基本的面向对象技术:第一种称为性质约束,即对基类的性质加以限制;第二种称为_,即增加派生类的性质。答案:(P129)性质扩展解析派生类通过继承可以从基类中获得成员,也可以自定义成员。5. 重载的运算符保持其原有的_、优先级和结合性不变。答案:(P183)操作数解析运算符重载时要遵循以下规则:(1)除了类属关系运算符“.”、成员指针运算符“.*”、作用域运算符“:”、sizeof运算符和三
30、目运算符“?:”以外,C+中的所有运算符都可以重载。(2)重载运算符限制在C+语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。(3)重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。6. 编译时的多态性通过_函数实现。答案:(P165)重载解析编译多态性,实现的方法主要通过函数的重载或运算符的重载。7. 预处理语句有三种,分别是宏定义、文件包含和_。答案:(P7)条件编译解析宏定义define,文件包含include和条件编译#if等。8. 构造函数、析构函数和友元函数中,不是该类成员的是_。答案:(P109)友元函数解析友元函数不是类
31、成员,但可以访问类中成员。9. 控制格式输入输出的操作中,函数_是设置域宽的。要求给出函数名和参数类型)。答案:(P193)setw(int)解析setw(int n):用来设置n输出宽度。10. 派生类的成员一般分为两部分,一部分是_,另一部分是自己定义的新成员。答案:(P127)从基类继承的成员解析派生类成员一个来自继承基类成员,一个来自本身增加的成员。11. C中ostream的直接基类_。答案:(P193)ios解析istream和ostream的直接基类是ios。12. vector的_方法返回向量中的最后一个对象。答案:(P151)back解析front():返回向量中的第1个对象
32、。back():返回向量中的最后一个对象。operator(size_type,n):返回向量中的第n1个对象(下标为n的向量元素)。13. 执行下列代码int i=230;cout “i=“hex iendl;程序的输出结果为_。答案:(P193)i=e6解析流类库中使用格式符,输出十六进制数据。14. 在C+中有两种参数传递方式即值传递和_传递。答案:(P51)引用解析函数参数传递有传值和传引用两种。15. 使用new为int数组动态分配10个存储空间是_。答案:(P10)new int10;解析new delete动态开辟空间和删除空间。new int10,注意不要写成new int(1
33、0),使用小括号只能开辟一个空间,使用10来初始化该值。16. 面向对象的四个基本特性是多态性、继承性、和封装性_。答案:(P37)抽象解析考察面向对象的四个特征。程序由一组抽象的对象组成,一组对象的共同特征抽象出类的概念,类是对象的抽象,对象是类的实例。封装即将数据和操作紧密结合提供访问的接口,外部通过接口实现访问数据,提供安全性。继承继承解决了类的扩展性。多态性不同对象调用相同的函数名,但调用不同的函数,实现不同的功能,解决了接口统一的问题。17. 定义虚函数所用的关键字是_。答案:(P170)virtual解析在成员函数前加virtual修饰的函数就是虚函数。但不是所有成员函数都可以定义
34、为虚函数的。比如构造函数,不能定义虚函数。18. 执行下列代码cout“oct:”oct34;程序的输出结果是_。答案:(P193)Oct:42解析oct表示八进制,hex表示十六进制,但它们只能输出整型的数据。19. 在C+中要创建一个文件输入流对象fin,同时该对象打开文件“Test.txt”用于输入,则正确的声明语句是_。答案:(P200)ifstream fin(“Test.txt”);解析文件操作中ifstream用于文件的输入,可以调用它的构造函数与要打开的文件进行关联20. 如果一个派生类只有一个唯一的基类,则这样的继承关系称为_。答案:(P130)单一解析根据派生类所拥有的基类
35、数目不同,可以分为单继承和多继承。一个类只有一个直接基类时,称为单继承;而一个类同时有多个直接基类时,则称为多继承。基类与派生类之间的关系如下:(1)基类是对派生类的抽象,派生类是对基类的具体化,是基类定义的延续。(2)派生类是基类的组合。多继承可以看作是多个单继承的简单组合。(3)公有派生类的对象可以作为基类的对象处理。C+程序设计模拟试卷(五)一、单项选择题1. 静态成员函数没有()A. 返回值B. this指针C. 指针参数D. 返回类型答案:B解析:(P107)静态成员函数是普通的函数前加入static,它具有函数的所有的特征:返回类型、形参,所以使用(P107)静态成员函数,指针可以
36、作为形参,也具有返回值。静态成员是类具有的属性,不是对象的特征,而this表示的是隐藏的对象的指针,因此静态成员函数没有this 指针。静态成员函数当在类外定义时,要注意不能使用static关键字作为前缀。由于静态成员函数在类中只有一个拷贝(副本),因此它访问对象的成员时要受到一些限制:静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员;若要访问非静态成员时,必须通过参数传递的方式得到相应的对象,再通过对象来访问。2. 在类的定义中,用于为对象分配内存空间,对类的数据成员进行初始化并执行其他内部管理操作的函数是()A. 友元函数B. 虚函数C. 构造函数D. 析构函
37、数答案:C解析:(P75)定义构造函数作用就是初始化对象,而析构函数释放对象空间。虚函数用于完成多态性,友元增加访问方便性。3. 所有在函数中定义的变量,都是()A. 全局变量B. 局部变量C. 静态变量D. 寄存器变量答案:B解析:(P136)变量存储类可分为两类:全局变量和局部变量。(1)全局变量:在函数外部定义的变量称为全局变量,其作用域为:从定义变量的位置开始到源程序结束。全局变量增加了函数之间数据联系的渠道,全局变量作用域内的函数,均可使用、修改该全局变量的值,但是使用全局变量降低了程序的可理解性,软件工程学提倡尽量避免使用全局变量。(2)局部变量:在函数内部定义的变量称为局部变量,
38、其作用域为:从定义变量的位置开始到函数结束。局部变量包含自动变量(auto)静态变量(static)以及函数参数。auto变量意味着变量的存储空间的分配与释放是自动进行的。说明符auto可以省略。函数中的局部变量存放在栈空间。在函数开始运行时,局部变量被分配内存单元,函数结束时,局部变量释放内存单元。因此,任两个函数中的局部变量可以同名,因其占有不同的内存单元而不影响使用。这有利于实现软件开发的模块化。static变量是定义在函数体内的变量,存放在静态存储区,不用栈空间存储,其值并不随存储空间的释放而消失。4. 假定AB为一个类,则执行“AB a(2), b3,*p4;”语句时调用该类构造函数
39、的次数为()A. 3B. 4C. 5D. 9答案:B解析:(P79)a(2)调用1次带参数的构造函数,b3调用3次无参数的构造函数,指针没有给它分配空间,没有调用构造函数。所以共调用构造函数的次数为4。5. 如果表达式+a中的“+”是作为成员函数重载的运算符,若采用运算符函数调用格式,则可表示为()A. a.operator+(1)B. operator+(a)C. operator+(a,1)D. a.operator+()答案:D解析:(P186)运算符的重载,前缀先让变量变化。调用a,等价为a.operator+(),注意无参的形式。后缀的话a+,等价于a.operator(0),带形参
40、,形参名可省。6. 已知f1和f2是同一类的两个成员函数,但f1不能直接调用f2,这说明()A. f1和f2都是静态函数B. f1不是静态函数,f2是静态函数C. f1是静态函数,f2不是静态函数D. f1和f2都不是静态函数答案:C解析:(P107)普通成员函数可以调用静态函数,相反静态函数不能调用普通成员函数,这与普通函数与常成员函数相同。因此选择C项。7. 一个函数功能不太复杂,但要求被频繁调用,则应把它定义为 ()A. 内联函数B. 重载函数C. 递归函数D. 嵌套函数答案:A解析:(P59)内联函数特征代码少,频繁调用,执行效率高。重载函数解决统一接口的问题;递归是子程序调用,程序调
41、用要耗费很多空间和时间,循环/迭代都比递归有效率得多,递归只是从形式上,逻辑比较简洁。嵌套函数即反复调用,速度较慢。所以选择A项。8. 解决定义二义性问题的方法有()A. 只能使用作用域分辨运算符B. 使用作用域分辨运算符或成员名限定C. 使用作用域分辨运算符或虚基类D. 使用成员名限定或赋值兼容规则答案:B解析:(P139)解决二义性问题主要要两种方法:(1)赋值兼容规则;(2)虚基类。9. 在main函数中可以用p.a的形式访问派生类对象p的基类成员a,其中a是()A. 私有继承的公有成员B. 公有继承的私有成员C. 公有继承的保护成员D. 公有继承的公有成员答案:D解析:(P132)公有
42、成员可以在类外访问,保护类型成员可以在派生类中访问,但不能在类外访问,在main函数中访问,说明a是公有成员。只有公有继承时a才能是公有的,所以D项正确。10. 在C+中不返回任何类型的函数应该说明为()A. intB. charC. voidD. double答案:C解析:无形参或无返回值都可以用void来声明,int char double分别是整型、字符型和实型。11. 若Sample类中的一个成员函数说明如下:void set(Sample& a),则Sample& a的含义是()A. 指向类Sample的名为a的指针B. a是类Sample的对象引用,用来作函数Set()的形参C.
43、将a的地址赋给变量SetD. 变量Sample与a按位与的结果作为函数Set的参数答案:B解析:(P53)成员函数使用对象的引用作为形参。该函数的功能是将已知对象的所有数据成员的值拷贝给相应对象的所有数据成员,不会建立临时对象,这里是对象的引用所以选择B。12. 要实现动态联编必须()A. 通过成员名限定来调用虚函数B. 通过对象名来调用虚函数C. 通过派生类对象来调用虚函数D. 通过对象指针或引用来调用虚函数答案:D解析:(P170)通过基类指针或基类引用来调用虚函数实现动态多态性,静态多态性通过重载来实现的。所以选择D项。13. 在派生类中定义虚函数时,可以与基类中相应的虚函数不同的是()A. 参数类型B. 参数个数C. 函数名称D. 函数体