1、二级 C+笔试 14及答案解析(总分:100.00,做题时间:90 分钟)一、B选择题/B(总题数:35,分数:70.00)1.在下面的 4个关键字中用来说明虚函数的是(分数:2.00)A.virtualB.publicC.protectedD.private2.在进行任何 C流的操作后,都可以用 C流的有关成员函数检测流的状态;其中只能用于检测输入流状态的操作函数名称是(分数:2.00)A.failB.eofC.badD.good3.有以下程序 #includeiostream #includestring using namespace std; class base private: c
2、harbaseName10; public: base() strcpy(baseName,“Base“); virtual char*myName() return baseName; char *className() return baseName; ; class Derived: public base private: char derivedName10; public: Derived() strcpy(derivedName,“Derived“); char *myName() return derivedName; char *className() return deri
3、vedName; ; void showPtr(base int main() base bb; Derived dd; showPtr(dD) ; retum 0; 动行后的输出结果为(分数:2.00)A.Derived BaseB.Base BaseC.Derived DerivedD.Base Derived4.下列叙述中正确的是(分数:2.00)A.接口复杂的模块,其耦合程度一定低B.耦合程度弱的模块,其内聚程度一定低C.耦合程度弱的模块,其内聚程度一定高D.上述三种说法都不对5.有以下程序 #includeiostream using namespace std; class sam
4、ple private: int x; public: sample (int A) x=a; friend double square (sample s); ; double square (sample s) return s.x*s.x; int main() sample s1(20),s2(30); coutsquare(s2)end1; return 0; 执行结果是(分数:2.00)A.20B.30C.900D.4006.以下程序的输出结果是 #includeiostream.h void main() int a=0,i; for(i=1;i5;i+) swich (i) c
5、ase 0: case 3:a+=2; case 1: case 2:a+=3; default:a+=5; coutaendl; return; (分数:2.00)A.31B.13C.10D.207.若有一个 MyClass类,则执行语句 MyClass a,b(2),*p;后,自动调用该类的构造函数 ( )次。(分数:2.00)A.2B.3C.4D.58.面向对象程序设计将数据和什么放在一起,作为一个相互依存、不可分割的整体来处理?(分数:2.00)A.对数据的操作B.信息C.数据隐藏D.数据抽象9.以下非法的赋值表达式是(分数:2.00)A.n=(i=2,+;B.j+;C.+(i+1);
6、D.x=j0;10.考虑下面的函数原型: void f(int a,int b=7,char c=); 下面的函数调用中,不合法的是(分数:2.00)A.f(5)B.f(5,8)C.f(6,)D.f(0,0,)11.一个在基类中说明的虚函数,它在该基类中没有定义,但要求任何派生类都必须定义自己的版本,此虚函数又称为(分数:2.00)A.虚析构函数B.虚构造函数C.纯虚函数D.静态成员函数12.下面有关重载函数的说法中正确的是(分数:2.00)A.重载函数必须具有不同的返回值类型B.重载函数形参个数必须不同C.重载函数必须有不同的形参列表D.重载函数名可以不同13.通过公有派生类的对象,只能访问
7、基类成员中的(分数:2.00)A.公有成员B.私有成员C.保护成员D.公有成员和保护成员14.考虑函数原型 void test(int a,int b=7, char z=*下面的函数调用中,属于不合法调用的是(分数:2.00)A.test(5);B.test(5,8);C.test(6,#);D.test(0,0*);15.下列叙述中错误的是(分数:2.00)A.一种数据的逻辑结构可以有多种存储结构B.数据的存储结构与数据处理的效率无关C.数据的存储结构与数据处理的效率密切相关D.数据的存储结构在计算机中所占的空间不一定是连续的16.下列虚基类的声明中正确的是(分数:2.00)A.class
8、 virtual B:public AB.virtual class B:public AC.class B:public A virmalD.class B:virmal public A17.下列关系运算中,能使经运算后得到的新关系中属性个数多于原来关系中属性个数的是(分数:2.00)A.选择B.连接C.投影D.并18.下列对模板的声明中,正确的是(分数:2.00)A.templateTB.templateclass T1,T2C.templateclassT1,class T2D.templateclassT1;class T219.下列叙述中正确的是(分数:2.00)A.线性链表中的各
9、元素在存储空间中的位置必须是连续的B.线性链表中的表头元素一定存储在其他元素的前面C.线性链表中的各元素在存储空间中位置不一定的连续的,但表头元素定存储D.线性链表中的各元素在存储空间的位置不一定是连续的,且各元素的存储顺序也是任意的20.一棵二叉树中共有 70个叶子结点与 80个度为 1的结点,则该二叉树中的总结点数(分数:2.00)A.221B.219C.231D.22921.下面对对象概念描述错误的是(分数:2.00)A.任何对象都必须有继承性B.对象是属性和方法的封装体C.对象间的通讯靠消息传递D.操作是对象的动态属性22.有以下程序: #inclydeiOStream using n
10、amespace std; int main() int x=15; while(x10break; coutxendl; return 0; 执行后的输出结果是(分数:2.00)A.15B.16C.17D.1823.设有 a、b、c、d、m、n 均为 int型变量,且 a=5、b=6、c=7、d=8、m=2、n=2,则逻辑表达式(m=aB) p+; coutMyClass:sendl; return 0; 运行后的输出结果是U 【11】 /U。(分数:2.00)填空项 1:_47.有以下面程序: #includeiostream using namespace std; long fib(i
11、nt n) if (n2) return(fib(n-1)+fib(n-2); else return 2; int main() coutfib(3)end1; rcturn 0; 则该程序的输出结果应该是U 【12】 /U。(分数:2.00)填空项 1:_48.已知 int DBL(int n)return n+n;和 long DBL(long n)return n+n)是一个函数模板的两个实例,则该函数模板的定义是U 【13】 /U。(分数:2.00)填空项 1:_49.有以下程序 #includeiostream using namespace std; class Base int
12、 a; public: Base(int x) a=x; vuid show()couta; ; class DeriVed:public Base int b; public: Derived (int i):Base(i+1),b(i) void show()coutb; ; int main() Base b(5),*pb; Derived d(1); pb= char *className() return baseName; ; class Derived: public base private: char derivedName10; public: Derived() strc
13、py(derivedName,“Derived“); char *myName() return derivedName; char *className() return derivedName; ; void showPtr(base int main() base bb; Derived dd; showPtr(dD) ; retum 0; 动行后的输出结果为(分数:2.00)A.Derived Base B.Base BaseC.Derived DerivedD.Base Derived解析:解析 本题考核虚函数的应用。类 Derived是从基类 Base公有派生而来的。因此, Der
14、ived 是基类 Base的子类型。main()函数中定义了一个基类对象 bb和一个派生类对象 dd。从程序中可看出派生类 Derived的对象 dd交给了处理基类 Base的对象的函数 showPtr 进行处理。由于在基类中函数 myName被定义成虚函数。所以在函数 showPtr中调用的 myName函数为派生类的成员函数 myName,从而输出Derived。然后输出 className,即基类名称 Base。4.下列叙述中正确的是(分数:2.00)A.接口复杂的模块,其耦合程度一定低B.耦合程度弱的模块,其内聚程度一定低C.耦合程度弱的模块,其内聚程度一定高 D.上述三种说法都不对解
15、析:解析 影响模块之间耦合的主要因素有两个:模块之间的连接形式,模块接口的复杂性。一般来说,接口复杂的模块,其耦合程度要比接口简单的的模块强,所以选项 A的说法错误; 耦合程度弱的模块,其内聚程度一定高,选项 B错误;选项 C正确。5.有以下程序 #includeiostream using namespace std; class sample private: int x; public: sample (int A) x=a; friend double square (sample s); ; double square (sample s) return s.x*s.x; int m
16、ain() sample s1(20),s2(30); coutsquare(s2)end1; return 0; 执行结果是(分数:2.00)A.20B.30C.900 D.400解析:解析 本题考核友元函数的应用。程序中函数 square是类 sample的一个友元函数,它可以直接访问类 sample的所有成员。它的功能是返回类 sample的私有数据成员 x的平方。所以程序的执行结果是:900。 注意:友元函数不是类的成员函数,在类外定义时不要加上类名及其作用域运算符 (:)。友元函数的调用与一般函数的调用的方式和原理一致,可以在程序的任何地方调用它。6.以下程序的输出结果是 #incl
17、udeiostream.h void main() int a=0,i; for(i=1;i5;i+) swich (i) case 0: case 3:a+=2; case 1: case 2:a+=3; default:a+=5; coutaendl; return; (分数:2.00)A.31 B.13C.10D.20解析:解析 本题考核 for语句和 switch语句的综合运用。 switch 语句的执行过程是:在 switch后面的表达式的值和 case后面常量表达式的值吻合时,就执行后面的语句。如果在该语句的后面没有break语句,则继续执行下一个 case,直到遇到 break语
18、句或 switch多分支的结束。在 switch语句中,break语句的作用是使流程跳出 switch结构,终止 switch语句的执行。因为每个 case语句后面都没有break语句,所以,第 1次循环(i=1)执行后,a 的值为 8。第 2次循环(i=2)执行过后,a 的值变为 16。第 3次循环(i=3)执行过后,a 的值变为 26。第 4次循环执行过后,a 的值变为 31。然后执行 i+,这时循环条件为假,结束循环。所以最后 a的值为 31。7.若有一个 MyClass类,则执行语句 MyClass a,b(2),*p;后,自动调用该类的构造函数 ( )次。(分数:2.00)A.2 B
19、.3C.4D.5解析:解析 本题考核构造函数的调用。C在创建一个对象时,会自动调用类的构造函数,在构造函数中可以执行初始化成员变量的操作。语句 MyClass a,b(2),*p;创建了两个对象 a、b 和一个对象指针。在创建 a和 b对象时系统会调用类的构造函数。但在创建对象指针 p时,不调用类的构造函数,因为指针p本身不定义类对象,而是定义了 p可以指向一个 MyClass的对象。8.面向对象程序设计将数据和什么放在一起,作为一个相互依存、不可分割的整体来处理?(分数:2.00)A.对数据的操作 B.信息C.数据隐藏D.数据抽象解析:解析 面向对象语言包含 3个要素,即对象、类和继承。这
20、3个要素反映了面向对象的传统观念。面向对象程序设计的本质是把数据和对数据的操作当成一个整体即对象。9.以下非法的赋值表达式是(分数:2.00)A.n=(i=2,+;B.j+;C.+(i+1); D.x=j0;解析:解析 对于任何一种赋值运算,其赋值号或复合赋值号左边必须是一个左值。左值是指具有对应的可由用户访问的存储单元,并且能够由用户改变其值的量。而在 C) 选项中赋值号对应的是表达式“i+1”,不是一个左值,因此是非法的赋值表达式。10.考虑下面的函数原型: void f(int a,int b=7,char c=); 下面的函数调用中,不合法的是(分数:2.00)A.f(5)B.f(5,
21、8)C.f(6,) D.f(0,0,)解析:解析 当一个函数中有多个默认参数时,则形参分布中默认参数应从右到左逐渐定义。在函数调用时,系统按从左到右的顺序将实参与形参结合,当实参的数组不足时,系统将按同样的顺序用说明或定义中的默认值来补齐所缺少的参数。在 C) 选项中,函数调用中只有两个实参,系统按从左到右的顺序将实参与形参结合时,实参将赋值给血型形参 b,显然则是非法的。11.一个在基类中说明的虚函数,它在该基类中没有定义,但要求任何派生类都必须定义自己的版本,此虚函数又称为(分数:2.00)A.虚析构函数B.虚构造函数C.纯虚函数 D.静态成员函数解析:解析 本题考核纯虚函数的定义。纯虚函
22、数是一种特殊的虚函数,纯虚函数是在虚函数的后面加上“=0”,表示该虚函数无函数体,并非赋值运算。纯虚函数的一般格式如下: virtual类型函数名(参数表)=0; 在很多情况下,在基类中不能对虚函数给出有意义的实现,而把它说明为纯虚函数,它的实现留给该基类的派生类去做。 题目中描述的是纯虚函数的特点。12.下面有关重载函数的说法中正确的是(分数:2.00)A.重载函数必须具有不同的返回值类型B.重载函数形参个数必须不同C.重载函数必须有不同的形参列表 D.重载函数名可以不同解析:解析 函数重载允许用同一个函数名定义多个函数。被重载的函数必须要有不同的形参列表。不可以根据函数返回值类型来重载函数
23、。13.通过公有派生类的对象,只能访问基类成员中的(分数:2.00)A.公有成员 B.私有成员C.保护成员D.公有成员和保护成员解析:解析 本题考核派生类的访问权限。派生类的继承方式有三种:公有继承 public、私有继承private 和保护继承 protected。当公有派生时,派生类成员函数只能访问基类的公有成员和保护成员,但是通过派生类的对象只能访问基类的公有成员。14.考虑函数原型 void test(int a,int b=7, char z=*下面的函数调用中,属于不合法调用的是(分数:2.00)A.test(5);B.test(5,8);C.test(6,#); D.test(
24、0,0*);解析:解析 本题考核函数的调用。题中函数声明带有默认参数,那么在 C) 选项的调用中,将会把字符型实参#赋值给整型形参 b,这不符合参数传递规则。15.下列叙述中错误的是(分数:2.00)A.一种数据的逻辑结构可以有多种存储结构B.数据的存储结构与数据处理的效率无关 C.数据的存储结构与数据处理的效率密切相关D.数据的存储结构在计算机中所占的空间不一定是连续的解析:解析 一种数据的逻辑结构根据需要可以表示成多种存储结构,常用的存储结构有顺序、链接、索引等,选项 A和选项 D正确。采用不同的存储结构,其数据处理的效率不同,因此,在进行数据处理时,选择合适的存储结构是很重要的,选项 C
25、正确,选项 B错误,应为所选。16.下列虚基类的声明中正确的是(分数:2.00)A.class virtual B:public AB.virtual class B:public AC.class B:public A virmalD.class B:virmal public A 解析:解析 本题考核虚基类的声明方式。虚基类说明格式如下: Virtual继承方式基类名 其中,virtual 是虚基类的关键词。虚基类的说明是用在定义派生类时,写在派生类名的后面。即:class派生类名:Virtual继承方式基类名。17.下列关系运算中,能使经运算后得到的新关系中属性个数多于原来关系中属性个数
26、的是(分数:2.00)A.选择B.连接 C.投影D.并解析:解析 连接运算是对两个关系进行的运算,其意义是从两个关系的笛卡尔积中选出满足给定属性间一定条件的那些元组。而两个关系的笛卡尔积中的属性个数是两个原关系中的属性个数之和。即两个关系经连接运算后得到的新关系中属性个数多于原来关系中属性个数。正确答案是 B。18.下列对模板的声明中,正确的是(分数:2.00)A.templateTB.templateclass T1,T2C.templateclassT1,class T2 D.templateclassT1;class T2解析:分析本题考核模板的定义。模板定义的类型参数表中包含一个或多个
27、由逗号分隔的类型参数项,每一项由关键字 class后跟一个用户命名的标识符,此标识符为类型参数,它不是一种数据类型,但可以同一般数据类型一样使用。在使用类模板时,必须将其实例化,即用实际的数据类型代替它。19.下列叙述中正确的是(分数:2.00)A.线性链表中的各元素在存储空间中的位置必须是连续的B.线性链表中的表头元素一定存储在其他元素的前面C.线性链表中的各元素在存储空间中位置不一定的连续的,但表头元素定存储D.线性链表中的各元素在存储空间的位置不一定是连续的,且各元素的存储顺序也是任意的 解析:解析 在线性表的链式存储结构中,各数据结点的存储序号不连续,且各结点在存储空间中的位置关系与逻
28、辑关系也不一致。在线性链表中,各数据元素之间的前后件关系是由各结点的指针域来指示的。所以,选项 D正确。20.一棵二叉树中共有 70个叶子结点与 80个度为 1的结点,则该二叉树中的总结点数(分数:2.00)A.221B.219 C.231D.229解析:解析 在任意一棵二叉树中,度为 0的结点(也就是叶子结点)总比度为 2的结点多一个。由于本题中的二叉树有 70个叶子结点,所以有 69个度为 2的结点。该二叉树中总结点数为:度为 2的结点数十度为 1的结点数+度为 0的结点数 =69+80+70=219。21.下面对对象概念描述错误的是(分数:2.00)A.任何对象都必须有继承性 B.对象是
29、属性和方法的封装体C.对象间的通讯靠消息传递D.操作是对象的动态属性解析:解析 继承是面向对象的方法的一个主要特征。继承是使用已有的类定义做为基础建立新类的定义技术。已有的类可当做基类来引用,则新类相应地可当做派生类来引用。但并不是所有的对象都必须有继承性。因此,选项 A中的说法是错误的,应为所选。22.有以下程序: #inclydeiOStream using namespace std; int main() int x=15; while(x10break; coutxendl; return 0; 执行后的输出结果是(分数:2.00)A.15B.16C.17 D.18解析:解析 本题考
30、核选择语句与循环语句的嵌套。由程序可知,当 x=16时,满足 if条件表达式,进入 if分支,执行“x+;break;”,所以最后程序输出 x的值为 17。23.设有 a、b、c、d、m、n 均为 int型变量,且 a=5、b=6、c=7、d=8、m=2、n=2,则逻辑表达式(m=aB) p+; coutMyClass:sendl; return 0; 运行后的输出结果是U 【11】 /U。(分数:2.00)填空项 1:_ (正确答案:3)解析:解析 本题考核静态数据成员。本题程序中把变量 s定义为静态数据成员,它被 MyClass 类的所有对象所共享,但它不属于类的任何一个对象,它的作用域是
31、类范围。在类 MyClass的构造函数中,每创建一个对象,s 就增 1,由此可知 s用来记录建立对象的个数。由于创建对象指针 p时并不会调用构造函数,所以 s最后的值是 3。47.有以下面程序: #includeiostream using namespace std; long fib(int n) if (n2) return(fib(n-1)+fib(n-2); else return 2; int main() coutfib(3)end1; rcturn 0; 则该程序的输出结果应该是U 【12】 /U。(分数:2.00)填空项 1:_ (正确答案:4)解析:解析 本题主要考查 C+
32、中递归函数。递归函数即自调用函数,在函数体内部直接或间接的自己调用自己,即函数的嵌套调用是函数本身。递归调用分为直接递归调用和间接递归调用两种形式。本题程序为求解典型递归数列 Fibonacci数列中任意项值的简化程序(主函数中的调用改成 fib(n)即变成求解任意项值)。主函数通过调用 fib()函数,fib()函数内部再通过一个分支结构判断是否进行递归调用或退出递归调用,调用方式为直接递归调用。主函数通过实参将值 3赋给 fib()函数的形参 n,由于 n=3满足 if 分支语句条件,因此函数进行递归调用,即计算 fib(2)和 fib(1)的值;将 2赋给 fib()函数的形参后,由于
33、n=2不满足 if分之语句条件,因此程序退出递归,返回 2;将 1赋给 fib()函数的形参后,函数同样返回 2。因此函数递归调用的最终结果为返回 2+2=4,即 fib(3)=4,程序最后输出值为 4。48.已知 int DBL(int n)return n+n;和 long DBL(long n)return n+n)是一个函数模板的两个实例,则该函数模板的定义是U 【13】 /U。(分数:2.00)填空项 1:_ (正确答案:templateclassTT DBL(T n)return n+n;)解析:解析 本题考核函数模板的使用。函数模板的一般说明形式如下:template类型形参表返
34、回类型函数名(形参表)/函数体)。函数调用方式为:函数名(实参表);。形参表中的类型以实参表中的实际类型为依据。由此易得答案。49.有以下程序 #includeiostream using namespace std; class Base int a; public: Base(int x) a=x; vuid show()couta; ; class DeriVed:public Base int b; public: Derived (int i):Base(i+1),b(i) void show()coutb; ; int main() Base b(5),*pb; Derived d
35、(1); pb=&d; pb-show(); return 0; 运行后的打印结果是U 【14】 /U。(分数:2.00)填空项 1:_ (正确答案:2)解析:解析 本题考核基类指针与派生类指针的使用。本例程序中类 Derived是从基类 Base 公有继承来的。main()中定义了基类对象 b和一个基类指针 pb,又定义了派生类 Derived的对象 do由于 Derived是 Base的子类型,因此可以将派生类 Derived的对象 d的地址赋值给指向基类 Base的指针 pb,但这时指针 pb只能使用从基类 Base继承的成员。所以通过对象指针 pb调用的 show函数是基类的成员函数s
36、how(),从而输出基类私有数据成员 a的值 2。50.有如下程序: #inCludeiostream using namespace std; class AA public: viltual void f() cout“AA“; ; class BB:public AA public: BB() cout“BB“; ; class CC:public BB public: virtual void f() BB:f(); cout“CC“; ; int main() AA aa,*p;BB bb;CC cc; p=&cc; p-f(); return 0; 运行后的输出结果U 【15】 /U。(分数:2.00)填空项 1:_ (正确答案:BBBBAACC)解析:解析 本题考核虚函数。本题中,函数 f()在基类 AA中派生类 CC中都声明为虚函数,所以采用动态联编。主函数首先定义类 AA的对象 aa和指针对象 p,然后定义了类 BB的对象 bb,此时调用了类 BB的构造函数输出 BB。再定义类 CC的对象 cc,由于类 CC是类 BB的派生类,所以此时又调用类 BB的构造函数输出 BB。最后执行语句“p=&cc;p-f();”,输出 AA和 CC。