《C++吕凤翥第3版课后习题答案.pdf》由会员分享,可在线阅读,更多相关《C++吕凤翥第3版课后习题答案.pdf(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C+吕凤翥(第三版)课后习题答案第一章C+语言概述一、选择题1.下列各种高级语言中,(C)是面向对象的程序设计语言。A BASIC;B PASCAL;C.C+;D.C2.下列各种高级语言中,(B)最早提出了对象的概念。A.Algol 60;B.Simula 67;C.Smalltalk;D.C+解析:面向对象语言借鉴了 20世纪50年代的人工智能语言LISP,引入了动态绑定的概念和交互式开发环境的思想;始于20世纪6 0年代的离散事件模拟语言SIMULA67,引入了类的要领和继承,成形于20世纪70年代的 Smalltalko3.下述面向对象抽象的原理中,(D)是不对的。A.数据抽象;B.行为
2、共享;C.进化;D.兼容解析:面向对象抽象原理是封装,继承和多态。封装指将数据和方法封装在类中(数据抽象),继承是子类可以继承父类的数据和方法(行为共享),多态是子类可以定义自己的方法,实现父类不能实现的行为(进化)。所以选D。4.(A)不是面向对象系统所包含的要素。A.重载;B.对象;C.类;D继承;解析:面向对象三要素:封装、继承和多态,对象是类的实现,只有面向对象才存在,重载是利用名称之外的标志(比如形参)作为区分以实现名称复用。5.关于C+与 C语言的关系的描述中,(D )是错误的A.C 语言是C+的一个子集;B.C 语言与C+是兼容的;C.C+是 C语言进行了一些改进;D.C+和 C
3、语言都是面向对象的解析:c语言是面向过程的语言。6 .下面关于对象概念的描述,(A)是错误的A.对象就是C 语言中的结构变量;B.对象代表着正在创建的系统中的一个实体C.对象是一个状态和操作(方法)的封装体D.对象之间的信息传递是通过消息进行的解析:对象中不止封装了数据,还封装了方法(操作),C语言中的结构变量只封装了数据。7 .下面关于类概念的描述中,(D )是错误的A.类是抽象数据类型的实现B .是具有共同行为的若干对象的统一描述体C.类是创建对象的样板D.类就是C语言中的结构类型解析:类是对一系列具有相同行为对象的抽象,因此类不仅封装了数据,还封装了方法(即使是抽象方法),而 C语言中的
4、结构类型只封装了数据。8 .C+对 C语言作了很多改进,下列描述中(D )使得C语言发生了质变,即从面向过程变成为面向对象A.增加了一些新的运算符B.允许函数重载,并允许设置缺省参数C.规定函数说明必须用原型D.引进了类和对象的概念解析:面向对象的一大明显特征就是具有类和对象。9 .按照标识符的要求,(A )符号不能组成标识符A.连接符;B.下划线;C.大小写字母;D.数字字符;解析:按照C+语法规定,标识符只能由数字、字母和下划线组成,并且只能以字母或下划线开头。1 0 .下列符号中,(D)不可作为分隔符(还有一种可能答案为C)A.,;B.:;C.?;D.;解析:逗号运算符可以将多个表达式组
5、合成一个表达式,整个表达式的值由最后一个表达式决定,示例:d l,d 2,d 3o冒 号(:)和 问 号(?)是三目运算符,在三目运算符中分隔表达式,示例:d l?a l:a 20分号(;)作为语句的结束标志,只能在语句末尾使用,用在语句中间会把一个语句分为两个语句,所以分号(;)不能作为分隔符使用。二、判断题1 .C+引进了引用的概念,对编程带来了很多方便。(V )2 .C+允许使用友元,但是友元会破坏封装性。(V )3.c+中使用了新的注释符(),c语言中注释符(/*.*/)不能在c+中使用(X)4.C+中为了减轻使用者的负担,与c语言相比较C+中减少了一些运算符。(X)解析:增加了一些运
6、算符,比如强制类型转换运算符,示 例 in t(a),将a 强制转换为整形。5.C+程序中,每条语句结束时都加一个分号(力。(J)6.C+中标识符内的大小写字母是没有区别的。(X)7.C+中不允许使用宏定义的方法定义符号常量,只能用关键字const来定义符号常量。(X)解析:推 荐 使 用 c o n s t关键字,因 为 const关键字定义的常量受到编译器的保护和检查,不允许修改,安全性更高,使用宏定义定义时,因为宏定义只做简单的替换,不检查语法和进行保护,安全性不好。8.在编写C+程序时,一定要注意采用人们习惯使用的书写格式,否则将会降低其可读性。(V)9.C+是一种以编译方式实现的高级
7、语言。(V)10.在C+编译过程中,包含预处理过程、编译过程和连接过程,并且这三个过程的顺序是不能改变的。(V)解析:因为宏定义的量编译器是无法直接识别的,必须由预处理程序进行替换,在宏定义中还引入了一些头文件,需要在预处理时引入,所以预处理必须在编译之前进行。预处理结束之后,需要对源程序进行词法和语义分析,检查是否存在语法错误。连接过程是不能直接使用源码文件的,必须使用编译过程产生的对象文件。对象文件还缺少必要的C+库,或者这些文件分散在不同的地方,因此还需要把它们连接起来并生成可执行文件才能运行程序。1 1 .预处理过程是一般编译过程之后连接过程之前进行的。(X )解析:编译顺序是预处理过
8、程f编译过程f连接过程,不可改变。1 2 .源程序在编译过程中可能会出现一些错误信息,但在连接过程中将不会出现错误信息。(X )解析:连接过程需要把一个程序的多个源文件或者把对象文件和库文件连接在一起,在这个过程中可能会出现文件路径出错,库文件缺失等错误。第二章数据类型和表达式一、选 择 题1.在1 6位 机 中,int型 字 宽 为(A )字 节。A.2;B.4;C.6;D.8解析:A N S I 标准中int类型长度为4个字节,是在3 2 位机上定义的,对于1 6 位机,int类型与3 2 位机的s hor t int类型相对应,长度为2个字节。2.类 型 修 饰 符u ns ig ned
9、修 饰(D )类 型 是 错 误 的A.C har;B.int;C.long int;D.f loat解析:四种基本数据类型修饰符s ig ned、u ns ig ned、long、s hor t都适用于整型和字符型,long 还适用于d ou b le型,但是都不适用于f loat型。3 .下列十六进制的整型数常数表示中,(C )是错误的A.Oxaf;B.OXlb:;C.2fx;D.OxAE解析:16进制数都以Ox或 OX开头。4 .下 列 d ou b le型常量表示中,(A )是错误的A.E15;B.35;C.3E5;D.3E-5解析:使用E 是 doube类型的科学计数法表示形式,E
10、之前因数为1 时也不可省略,否则会被编译器当作变量名而引发语法错误。5 .下列字符常量表示中,(C)是错误的A.105;B*;C.4f;D.a解析:使用 和十六进制数表示转义字符时,必须在十六进制数前面加x:、x4f6 .下列字符串常量表示中,(无)是错误的(都没错)A yes or No ;B.0K!;C.abcdn;D.ABCO解析:C+,字符串的结束符会被自动添加,不用手动添加,浪费一个字节。7 .下列变量名中,(A )是合法的A CHINA;B.byte-size;C.double;D.A+a解析:变量名只能由字母、数字和下划线组成,且必须以字母开头,并且不能使用C+的关键字。8 .在
11、 int a 5 =l,3,5,数组元素 a l 的 值 是(C )A.1;B.0;C.3;D.29.在 intb3=1,3,2,4,5,6,0中,b2 2的值是(C)A.0;B.5;C.6;D.2解析:b 2 2 表示第三行第三列的元素,所以为6。10.下列给字符数组进行初始化中,(A)是正确的A.char si =abed;B.char s23=xyzC.char s3 3=x,y,z D.char s42 3=xyz,mnp 解析:因为每个字符串后还有一个结束符 0 ,所以实际使用空间比字符串长度多一个字节。B 选项没有预留、0空间,数组溢出。C选项声明的是多维字符数组,应该为 x ,y
12、 ),z 。D选项声明的也是多维字符数组,并且没有预留 0 空间,数组会溢出,应为c har s 4 2 4 =“x y z”,“mnp”。11.在 int a=3,*p=&a;中,*P 的 值 是(D)A.变量a 的地址值;B 无意义;C.变量P 的地址值;D.3解析:*P中存放了 a的地址值,而 a中存储的值为3,所以*p值为3。12.对于int*pa5的描述,(D)是正确的A.pa是一个指向数组的指针,所指向的数组是5 个 int型元素B.pa是一个指向某个数组中第5 个元素的指针,该元素是int型变C.pa5表示某个数组的第5 个元素的值D.pa是一个具有5 个元素的指针数组,每个元素
13、是一个int型指针解析:指针数组声明为类型 名称 长度,示例:i n t *p 4 ;数组指针声明为 类型(名称)指向数组的长度,示例:i n t (*p)3 K13.下列关于指针的运算中,(D)是非法的。A.两个指针在一定条件下,可以进行相等或不等的运算B.可以用一个空指针赋值给某个指针C.一个指针可以加上两个整数之差D.两个指针在一定条件下,可以相加解析:指针的值对应着内存地址,将指针相加得到的数值可能不是内存地址,会引发错误。指针允许的操作有赋值;与整数相加减(指针偏移);一定条件下,两个指针可以相减,得到指针之间的偏移量;两个指针之间还可以比较。14.指针可以用来表示数组元素,下列表示
14、中(A)是错误的。已知:int a37;A.*(a+l)5;B,*(*a+3);C*(*(a+l);D.*(&a00+2)解析:使用指针表示数组元素时,不能同时使用指针偏移和索引来取出数组元素。15.下列表示引用的方法中,(A)是正确的。已知:int m=10;A.int&x=m;B.int&y=10;C.int&z;D.float&t=&m解析:引用是某个已知变量或对象的别名,引用不是变量,本身没有值,也没有地址(因此不能对它赋值),它不占内存空间。引用声明格式:(被引用对象类型)&引 用 名=被引用变量名。16.下列各运算符中,(A)可以作用于浮点数。A+;B.%;C.;D.&解析:+用于
15、浮点数和用于整型的效果是一样的,其他的运算符只能用于整数。17.下列各运算符中,(D)不能作用于浮点数A./;B.&;C.!;D.解析:A 选项的除法运算符可以用于浮点数,B 选项是逻辑与,可以用于浮点数判断,C 选项是逻辑求反,可以用于浮点数,D 选项是按位求反,只能用于整型和字符型。1 8 .下列各运算符中,(B )优先级最高。A.+(双目);B.*(单目);C.=;D.*=解析:*的优先级为2 级(取 内 容)或 3 级(乘 法),+的优先级为4 级,b)+(int(b)%2);D.-a+b解析:D 选项不能将自减运算符(-)和负号一起使,会被编译器视为无效表达式。2 2 .下列表达式中
16、,(D )是合法的已知:double m=3.2;int n=3。A.m 2;B.(m+n)|n;C.!m*=n;D.m=5,n=3.1,m+n解析:A 选项,double类型不能进行移位操作:B 选项,m+n为 double类型,不能进行按位或操作;C 选项,因为取反运算符优先级大于*=,所以先取反再赋值,经过取反,左边!m 的结果为0,是一个常数,不能进行赋值。23.下列关于类型转换的描述中,(A)错误的A.在不同类型操作数组成的表达式中,其表达式类型一定是最高类型doube 型B.逗号表达式的类型是最后一个表达式的类型C.赋值表达式的类型是左值的类型D.在由低向高的类型转换中是保值映射解
17、析:A 选项,在不同类型操作数组成的表达式中,所有操作数都会被转换为最高类型进行运算,但不一定是d o u b l e 型。D 选项,由低向高的类型转换不会损失精度,即保值映射。24.下列各表达式中,(D)有二义性。已知:inta(5),b(6)A.a+b3;B.+a+b+;C.b+(a=3);D.(a=3)-a+解析:0 的优先级最高,+优先级为2级,+、-为 4级,为 5级。A 选项,根据优先级先执行+再执行3,结果为1;B选项根据优先级先执行+a,再执行a+b,再执行b加 1,结果为1 2 o C选项先赋值a=3,再执行a+b,结果为9;D选项先执行括号中的内容,再执行-,最后a 加 1
18、,结果为1。可以看到D选项的结果和预期的0一致,所 以 D具有二义性。25.用来表示指向结构变量指针的成员是(B)运算符。A.;B.-;C.;D.解析:A 是成员选择符,C是右移位,D是左移位。26.下列关于结构数组的描述中,有几处错误(A)struct abint a;char c;double a;a,ab;A.l;B.2;C.3;D.4解析:结构成员变量定义不能重名,所以共一处错误。27.下列关于结构数组的描述中,错误的是(A)A.结构数组的元素可以是不同结构类型的结构变量B.结构数组在定义时可以赋初值C.组成结构数组的结构变量的成员可以是数组D.结构数组可定义在函数体内,也可以定义在函
19、数体外解析:结构数组声明形式为stru ct结构名数组名,只能存放同一类型的结构变量。28.联合成员的地址值和所占的字节数(A)A,都相同;B.都不相同;C.前者相同;D.前者不同,后者相同。解析:联合成员是共用一块内存单元,即所有成员是共址的,单元的大小与联合中数据长度最长的相同。二、判断题1.任何字符常量与一个任意大小的整型数进行加减都是有意义的(X)解析:字符编码是有范围的,超出这个范围就失去意义。2.转义序列表示法只能表示字符不能表示数字(7)解析:转义序列表示法表示字符常量。3.在命名标识符中,大小写字母是不加区别的(X)4.C+程序中,对变量一定要先说明再使用,说明只要在使用之前就
20、可以(J)5.C+中数组元素的下标是从0开始,数组元素是连续存储在内存单元中的(V)6.数组赋初值时,初始值表中的数据项的数目可以大于或等于数组元素的个数(X)7枚举变量的取值受到该枚举变量所对应的枚举表中的枚举符的局限(V)8.指针是用来存放某种变量的地址值的变量。这种变量的地址值也可以存放在某个变量中,存放某个指针的地址值的变量称为指向指针的指针,即二级指针(V)9.引用是用来给某个变量以别名的变量。对引用的操作,实质上就是对被引用的变量的操作(J)10.运算符的优先级和结合性可以确定表达式的计算顺序(V)11.在说明语句中,inta(5),&b=a,*p=&a中,b的值和*p的值是相等的
21、(V)解析:b是对 a的引用,*p是a的指针,因此二者的值想等。12.已知:int a,;表达式(a=7)+a具有二义性。(X)13.移位运算符在移位操作中,无论左移还是右移,所移出的空位一律补0。(X)解析:右移时左边移出的空位要么一律补0,要么一律补符号位,这由机器决定。14.某个变量的类型高是指该变量被存放在内存中的高地址处(X)解析:类型高是指数据长度大。15.隐含的类型转换都是保值映射,显式的类型转换都是非保值映射(X)解析:只有由低类型向高类型转换数据精度才不会丢失,才是保值映射,由高类型向低类型转换都是非保值映射,显式的类型转换如果在转换时数据精度不丢失,也是保值映射。16.类型
22、定义可以用来定义一些C+中所没有的新的类型(X)解析:只能定义现有类型的别名。通过typedef实现。17.定义结构变量时必须指出该结构变量是属于某种结构类型的。(J)18.无名结构是不允许定义结构变量的(X)解析:可以,例如:struct int a;char c;double ac;ad,ab;15、同一结构中的不同成员变量占用不同的内存单元(V)16、联合的所有成员变量都是没有内存地址的(X)解析:联合的成员变量共用内存地址,不是没有内存地址。第三章预处理和语句一、选择题L预处理命令在程序中都是以(B)开头的。A.*;B.#;C.:;D/;2.文件包含命令中被包含的文件的扩展名(D)(也
23、可以没有)A必须为h;B.不能用h;C必须是c;D.不一定是h解析:C+中的头文件都是.h扩展名。3.下列条件编译命令中#if(A)语句序列1#elseSendifA整常量表达式;B任何标识符;C任意表达式;D被定义的宏名;4.带参数的宏定义中,程序中引用宏定义的实参(D)A只能是常量;B只能是整型量;C只能是整形表达式;D可以是任意表达式5.下列是(A)语句A.;B.a=17;C.x+y;D.coutwnw解析:语句都是以分号(力结尾的。6.下列for循环的次数为(B)for(int i(0),x=0;!x&i=5;i+)A.5;B.6;C.l;D.无限;7.下列while循环的次数是(A)
24、while(int i=0)i-;A.O:B.l;C.5;D.无限解析:先执行inti=0后再以i作为循环判断条件,因为i始终是0,所以循环条件始终不满足,循环不会运行。8,下列do while循环的循环次数为(D)已知:int i(5);do couti-endl;i-;while(i!=0)A.O;B.l;C.5;D.无限;9.下列for循环的循环体执行次数为(D)for(int i(0),j(10);i=j=10;i+,j-)A.O;B.l;C.10;D.无限10.已知:int a力,下 列switch语句中,(D)是正确的。A.switch(a)case a:a+;break;case
25、 b:b+;break;)B.switch(a+b)case l:a+b;break;case 2:a-b)C.switch(a*a)case l,2:+a;case 3,4:+b;)D.switch(a/10+b)case 5:a/5;break;default:a+b;)解析:选项A、C,case语句只能使用整常形表达式,不能使用变量;选 项 B,表达式末尾没加分号;11.下述关于循环体的描述中,(C)是错误的A.循环体中可以出现break语 句 和 continue语句;B.循环体中还可以出现循环语句;C 循环体中不能出现goto语句D.循环体中可以出现开关语句解析:got。可以出现在程
26、序的任何地方。12.下述关于goto语句的描述中,(D)是正确的。A.goto语句可在一个文件中随意转向B.goto语句后面要跟上一个它所转向的语句;C.goto语句可以同时转向多条语句D.goto语句可以从一个循环体内转到循环体外解析:选项A,C+规定goto只能在一个函数体内进行转向;选 项 B,goto后面要跟它所转向的语句标号,不是语句;选项C,goto只能转到单条语句。13.下述关于break语句的描述中,(C)是不正确的。A.break语句可用于循环体内,它将退出该重循环B.break语句可用于开关语句中,它将退出开关语句C.break语句可用于if体内,它将退出if语句D.bre
27、ak语句在一个循环体内可以出现多次解析:break用在开关语句或者循环语句内,用于结束这些语句,在其他语句中不起作用。14.下述关于开关语句的描述中,(A)是正确的。A.开关语句中default子句可以没有,也可以有一个B.开关语句中每个语句序列中必须有break语句C.开关语句中default子句只能放在最后D.开关语句中case子句后面的表达式可以是整形表达式解析:选 项 B,break可以有,也可以没有,没有的话执行所有满足条件的语句;选项 C,default可以放在任何位置;case子句后面的表达式必须是整常型表达式。15.下列关于条件语句的描述中,(C)是错误的A.if语句中只有一个
28、 else子句B.if语句中可以有多个else if子句C.if语句中if体内不能是开关语句D.if语句中的if体中可以是循环语句二、判断题1.预处理命令是在进行编译时首先执行的,然后再进行正常编译(V)2.宏定义命令是以分号结束的(X)3.带参数的宏定义只能有1 至 2 个参数(X)4.文件包含命令所包含的文件是不受限制的(X)解析:一条文件包含语句只能引入一个文件。5.条件编译命令只在编译时才有作用(V)6.预处理命令的主要作用是提高效率(X)解析:使用预处理命令可以使程序书写更简练,清晰7.复合语句就是分程序(X)解析:含有一条或多条说明语句的复合语句称为分程序。8.条件语句不能作为多路
29、分支语(X)解析:if else语句嵌套使用也可以实现多路分支9.开关语句不可以嵌套,在开关语句的语句序列中不能再有开关语句(X)10.开关语句中的default关键字,只能放在该语句的未尾,不能放在开头或中间(X)解析:default可以放在任何位置。11.switch语句中必须有break语句,否则无法退出switch语句(X)解析:switch语句的 代表语句结束,可以退出语句。12.while循环语句的循环体至少执行一次(X)13.do-while循环可以写成while循环的格式(,)14.for循环是只有可以确定的循环次数时才可使用,否则不能用for循环(X)解析:循环次数不确定时,
30、可以使用break退出for循环15.只有for循环的循环体可以是空语句,其他种循环的循环体不能用空语句(X)解析:都可以为空。16.当循环体为空语句时,将说明该循环不作任何工作,只起延时作用(X)17.循环是可以嵌套的,循环体内可以包含另一种循环语句(V)18.在多重循环中,内重循环的循环变量应用的次数比外重的多(V)19.break语句可以出现在各种循环体中(V)20.continue语句只能出现在循环体内(V)第四章函数和作用域一、选择题1.当一个函数无返回值时,定义它时函数的类型应是(A)A.void;B.任意;C.int;D.无2.在函数说明时,下列(D)项是不必要的A 函数的类型;
31、B 函数参数类型和名字;C 函数名字;D 返回值表达式解析:函数说明格式为类型 函数名 参数表3.在函数的返回值类型与返回值表达式的类型的描述中,(B)是错误的A.函数的返回值的类型是定义函数时确定的B.函数的返回值的类型就是返回值表达式的类型C.函数的返回值表达式的类型与函数返回值类型不同时,表达式类型应转换成函数返回值类型D.函数的返回值类型决定了返回值表达式的类型解析:函数返回值的类型是在函数定义时确定的,不会随返回值表达式类型改变而改变。4.在一个被调用函数中,关 于 return语句使用的描述,(D)是错误的A.被调用函数中可以不用return语句B.被调用函数中可以使用多个retu
32、rn语句C.被调用函数中,如果有返回值,就一定要有return语句D.被调用函数中,一个 return语句可返回多个值给调用函数解析:函数体中可以有多条return语句,大多在if语句中使用,实现按不同条件返回。一条return只能返回一个值。5.下列描述(D)是引用调用A.形参是指针,实参是地址值B.形参和实参都是变量;C.形参是数组名,实参是数组名D.形参是引用,实参是变量解析:选项A 为传址调用;选 项 B 为传值调用;选项C 为传址调用,因为数组名代表了数组的指针;6.在传值调用中,要求(C)A.形参和实参类型任意,个数相等B.形参和实参类型都完全一致,个数相等C.形参和实参对应的类型
33、一致,个数相等D.形参和实参对应的类型一致,个数任意7.在C+中,关于下列设置参数默认值的描述中,(C)是正确的A.不允许设置参数的默认值B.设置参数默认值只能在定义函数时设置C.设置参数默认值时,应该是先设置右边的参数再设置左边的参数D.设置参数默认值时,应该全部参数都设置解析:A 选项,C+允许设置默认值;B 选项,参数默认值可以在函数定义或者函数说明时设置;D 选项,设置参数默认值可以不必全部都设置,但是没设置的参数一定要在设置默认值的参数的左边。8.重载函数在调用时选择的依据中,(无)错误的A.参数个数;B.参数的类型;C.函数名字;D.函数的类型解析:函数重载是指一个函数名可以对应着
34、多个函数实现。重载确定函数实现时,要求同名函数的参数个数或参数顺序或返回值类型不同。9.下列的标识符中,(C)是文件级作用域的A.函数;B 语句标号;C 外部静态类标识符;D.自动类标识符解析:作用域从大到小分为程序级、文件级、函数级、块级。A 选项,内部函数作用域为文件级,外部函数的作用域可以是程序级;B 选项,语句标号属于函数级作用域,只在使用它函数内可见;C 选项,外部静态类标识符作用域为文件级;D 自动类标识符,作用域为函数级。10.有 int型变量,在程序中使用频度很高,最好定义为(A)A.register;B auto;C.extern;D.static解析:register修饰符
35、暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存取速度。11.下列标识符中,(B)不是局部变量A register类;B.外 部 static类;C.auto类;D 函数形参解析:局部变量是作用域在函数级或块级的变量,包括自动类变量,寄存器变量和内部静态类变量以及函数参数。外部变量是作用在程序级的变量,外部静态变量是作用域在文件级的变量。12.下列存储类标识符中,(C)的可见性与存在性不一致A.外部类;B.自动类;C.内部静态类;D.寄存器解析:静态类在作用域内可见,在作用域外不可见但是仍然存在。A、C、D 三种类型的标识符可见性和存在性都是一致的,
36、即在作用域内可见时存在,不可见时就消失了。13.下列存储类标识符中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用(A)比较合适A 内联函数;B 重载函数;C 递归调用;D 嵌套调用解析:使用内联函数,编译器将程序中出现的内联函数调用表达式用内联函数的函数体来进行替换,省去了函数转移的时间开销,因此对于函数代码不是很大,对执行速度要求很高的函数,使用内联函数比较恰当。14.采用函数重载的目的在于(D)A.实现共享;B 减少空间;C 提高速度;D 使用方便,提高可读性解析:函数重载可以减少函数命名的数量,方便编程,也方便阅读程序。15.将两个字符串连接起来组成一个字符串时,选用
37、(C)函数A.strlen();B.strcpy();C.strcat();D.strcmp()解析:A 选项,获取字符串长度;B 选项,复制字符串;D 选项,比较字符串;16.定义函数模板使用的关键宇是(C)A.classB.inlineC.templateD.operator解析:A 选项,定义类;B 选项,定义内联函数;D 选项,操作符重载或者是自定义对象类型隐式转换。17.下列有关对函数模板参数的描述,错 误 的 是(C)A.模板参数可以是1 个或多个B.通常每个模板参数前必须加classC.模板参数是一个算术表达式D.模板参数是参数化的类型18.下列关于函数模板和模板函数的描述中,错
38、误的是(D)A.函数模板是一组函数的样板B.函数模板是定义重载函数的一种工具C.模板函数是函数模板的一个实例D.模板函数在编译时不生成可执行代码解析:模板函数是函数模板的实例,是根据函数模板生成的可执行的函数,在编译时会生成可执行代码。函数模板是函数的样板,因为参数的类型没有确定,必须在实例化之后才能执行,所以不参与编译。19.已知函数模板定义如下:template T min(Tx,Ty)(return x*的功能是(A)oA.使用对象指针通过指向成员的指针表示成员的运算符B.使用对象通过指向成员的指针表示成员的运算符C.用来表示指向对象指针的成员的运算符D.用来表示对象的成员的运算符解 析
39、:B 选项为(.*);C选项为(-);D选项(.)(3)已知fl(int)是类A的公有成员函数,p是指向成员函数皿)的指针,采用(B)是正确的。A.p=flB.p=A:flC.p=A:fl()D.p=fl()已 知:p是 一 个 指 向 类A数 据 成 员m的 指 针,A l是 类A的 一 个 对 象,如 果 要 给m赋 值 为5,(C)是 正 确 的。A.Al.p=5B.Al-p=5C.Al.*p=5D.*Al.p=5解析:给m赋值需要使用对象通过指向类成员的指针来操作该类对象成员,因此选择C已知:类A中一个成员函数说明如下:void S et(A&a);其中,A&a 的含义是(C)A.指向
40、类A 的指针为aB.将 a 的地址值赋给变量SetC.a是类A 的对象引用用来作为函数Set。的形参D.变量A 与 a 按位相与作为函数Set()的参数下列关于对象数组的描述中,(D)是错误的。A.对象数组的下标是从0 开始的B.对象数组的数组名是一个常量指针C.对象数组的每个元素是同一个类的对象D.对象数组只能赋初值,而不能被赋值解析:对象数组可以赋初值,也可以再次赋值,但是只能使川同一个类的对象赋值。下列定义中,(B)是定义指向数组的指针P。A.int*p|:5B.int(*p)C.(int*)p5D.int*p解析:A选项是指针数组,有5个元素;C选项语法错误;D是指针数组。下列说明中c
41、onst char*ptr;ptr应该是(AC)OA.指向字符常量的指针B.指向字符的常量指针C.指向字符串常量的指针D.指向字符串的常量指针(9)已知:print。函数是一个类的常成员函数,它无返回值,下列表示中,(A)是正确的。A.void print()constB.const void print()D.void print(const)C.void const print()(10)关 于new运算符的下列描述中,(D)是错误的。A.它可以用来动态创建对象和对象数组B.使用它创建的对象或对象数组可以使用运算符delete删除C.使用它创建对象时要调用构造函数D.使用它创建对象数组时必
42、须指定初始值解析:使用new类名 口创建对象数组可以不指定初始值,使用new口创建对象数组时不能进行初始化。(11)关于delete运算符的下列描述中,(C)是错误的。A.它必须用于new返回的指针B.它也适用于空指针C.对一个指针可以使用多次该运算符D.指针名前只用一对方括号符,不考虑所删除数组的维数解析:对一个指针只能进行一次delete操作。(12)具有类型转换功能的构造函数应该是(B)。A.不带参数的构造的数B.带有一个参数的构造函数C.带有两个以上参数的构造函数D.默认构造函数解析:单个参数的构造函数提供了类型转换功能。(13)下列关于类模板的描述中错误的是(C)A.类模板的成员函数
43、可以是函数模板B.类模板生成模板类时,必须指定参数化的类型所代表的具体类型C.定义类模板时只允许有一个模板参数D.类模板所描述的是一组类解析:至少要有一个模板参数,可以有多个模板参数2.判断下列描述是否正确,对者划J、错者划X。指向对象的指针和指向类的成员的指针在表示形式上是不相同的。(J)解析:指向类的成员指针表示形式int A:*pl=&A:c:指向对象的指针表示形式为A*p2=&a;(2)已知:m是类A的对象,n是类A的公有数据成员,p是指向类A中n成员的指针。下述两种表示是等价的:m.n和m.*p。(V)解析:前一种通过对象引用成员变量,后一种通过对象使用指向成员变量的指针进行引用,二
44、者代表的都是同一个量。指向对象的指针与对象都可以作为函数参数,但是使用前者比后者好些。(J)解析:使用对象的指针作为函数参数是传址调用,不需要对对象进行拷贝,使用对象作为参数是传值调用,需要对传入的对象进行一次拷贝,空间开销增大,程序性能下降,因此使用对象指针好一些。(4)对象引用作为函数参数比用对象指针更方便些。(J)解析:使用对象引用具有对象指针的优点,同时比对象指针使用方式更简洁。对象数组的元素可以是不同类的对象。(X)解析:对象数组的元素只能是同一个类的对象。(6)对象数组既可以赋初值又可以赋值。(J)指向对象数组的指针不一定必须指向数组的首元素。(J)一维对象指针数组的每个元素应该是
45、某个类的对象的地址值。(J)解析:对象指针数组是指针数组,每个元素都是对象的指针。(9)const char*p说明了 p 是指向字符串的常量指针。(X)解析:不一定是指向字符串的,也可能是指向字符的,指向字符串的常指针应该这样声明const char*p=string”(10)一个能够更新的变量使用在一个不能被更新的环境中是不破坏类型保护的,反之亦然。(义)解析:常对象必须使用常成员函数,不能使用非常成员函数;非常对象可以使用常成员函数,也可以使用非常成员函数。(11)一个类的构造函数中可以不包含对其子对象的初始化。(X)解析:在类中出现了子对象时,该类的构造函数要包含对了对象的初始化。(1
46、2)类型转换函数不是成员函数,它是用来进行强制类型转换的。(X)解析:类型转换函数是用户定义的成员函数。(13)使用模板可以减少重复劳动,提高代码重用率。(J)(14)C+语言中模板分为函数模板和类模板两种。(J)(15)类模板可以生成若干个模板类,每个模板类又可定义若干个对象。(J)第七章继承性和派生类1.选择填空下列对派生类的描述中,(D)是错的。A.一个派生类可以作另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类保持不变解析:公有继承时,基类的的公有和保护成员作为派生类的成员时,保持原有的访问
47、权限,基类的私有成员在派生类中不可见;私有继承时,基类的公有和保护成员都变为派生类的私有成员,并且不能被这个派生类的子类访问;保护继承时,基类的公有和保护成员都称为派生类的保护成员,并且不能被派生类的对象访问。派生类的对象对它的基类成员中(A)是可以访问的。A.公有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.私有继承的公有成员解析:派生类的对象只可以访问公有继承方式下基类中的公有成员。派生类的构造函数的成员初始化列表中,不能包含(C)。A.基类的构造函数B.派生类中子对象的初始化C.派生类中静态数据成员的初始化D.派生类中一般数据成员的初始化解析:静态数据成员的初始化应在类体
48、外进行。派生类的构造函数负责对基类、子对象和一般数据成员初始化。关于子类型的描述中,(A)是错的。A.子类型就是指派生类是基类的子类型B一种类型当它至少提供了另一种类型的行为,则这种类型是另一种类型的子类型C.在公有继承下,派生类是基类的子类型D.子类型关系是不可逆的下列关于赋值兼容规则的描述中,错误的是(B)A.赋值兼容规则在子类型情况下才可使用B.公有继承下,派生类对象不可给基类对象赋值C.公有继承下,派生类对象可对基类对象引用进行初始化D.公有继承下.派生类对象的地址值可以赋值给基类的对象指针解析:公有继承下,派生类是基类的子类型,可以赋值给基类对象,这是派生类只发挥基类的作用。(6)关
49、于多继承二义性的描述中,(C)是错的。A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性B.解决二义性的最常用的方法是用成员名的限定法C.基类和派生类中同时出现的同名函数,也存在二义性问题D.一个派生类是从两个基类派生来的,而这两个基类又有一个公共的基类,对该基类成员进行访问时,也可能出现二义性。解析:基类和派生类中同时出现的同名函数时,派生类的函数将覆盖基类的函数。设置虚基类的目的是(B)。A.简化程序B.消除二义性C.提高运行效率D.减少目标代码解析:引入虚基类的真正目的之一是消除二义性问题。在带有虚基类的多层派生类构造函数的成员初始化列表中都要列出基类的
50、构造函数,这样将对虚基类的子对象初始化(D)。A.与虚基类下面的派生类个数有关B.多次C.二次D.一次解析:对于虚基类来说,派生类的对象中只有一个虚基类子对象。规定在建立对象时指定的类为最派生类,虚基类子对象由最派生类的构造函数通过调用虚基类的构造函数初始化,而该派生类的直接基类的中对虚基类构造函数的调用被忽略,保证了虚基类的子对象只被初始化一次。2.判断下列描述的正确性,对者划J,错者划X oC+语言中,既允许单继承,又允许多继承。(J)派生类是从基类派生出米,它不能再生成新的派生类。(X)解析:派生类可以作为基类派生出其他类。派生类的继承方式有两种:公有继承和私有继承。(X)解析:派生类的