[计算机类试卷]2006年4月国家二级(C++)笔试真题试卷及答案与解析.doc

上传人:diecharacter305 文档编号:492551 上传时间:2018-11-30 格式:DOC 页数:29 大小:83.50KB
下载 相关 举报
[计算机类试卷]2006年4月国家二级(C++)笔试真题试卷及答案与解析.doc_第1页
第1页 / 共29页
[计算机类试卷]2006年4月国家二级(C++)笔试真题试卷及答案与解析.doc_第2页
第2页 / 共29页
[计算机类试卷]2006年4月国家二级(C++)笔试真题试卷及答案与解析.doc_第3页
第3页 / 共29页
[计算机类试卷]2006年4月国家二级(C++)笔试真题试卷及答案与解析.doc_第4页
第4页 / 共29页
[计算机类试卷]2006年4月国家二级(C++)笔试真题试卷及答案与解析.doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

1、2006 年 4月国家二级( C+)笔试真题试卷及答案与解析 1 下列选项中不属于结构化程序设计方法的是 ( A)自顶向下 ( B)逐步求精 ( C)模块化 ( D)可复用 2 两个或两个以上模块之间关联的紧密程度称为 ( A)耦合度 ( B)内聚度 ( C)复杂度 ( D)数据传输特性 3 下列叙述中正确的是 ( A)软件测试应该由程序开发者来完成 ( B)程序经调试后一般不需要再测试 ( C)软件维护只包括对程序代码的维护 ( D)以上三种说法都不对 4 按照 “后进先出 ”原则组织数据的数据结 构是 ( A)队列 ( B)栈 ( C)双向链表 ( D)二叉树 5 下列叙述中正确的是 (

2、A)线性链表是线性表的链式存储结构 ( B)栈与队列是非线性结构 ( C)双向链表是非线性结构 ( D)只有根结点的二叉树是线性结构 6 对如下二叉树进行后序遍历的结果为 ( A) ABCDEF ( B) DBEAFC ( C) ABDECF ( D) DEBFCA 7 在深度为 7的满二叉树中,叶子结点的个数为 ( A) 32 ( B) 31 ( C) 64 ( D) 63 8 “商品 ”与 “顾客 ”两个实体集之间的联 系一般是 ( A)一对一 ( B)一对多 ( C)多对一 ( D)多对多 9 在 E-R图中,用宋表示实体的图形是 ( A)矩形 ( B)椭圆形 ( C)菱形 ( D)三角

3、形 10 数据库 DB、数据库系统 DBS、数据库管理系统 DBMS之间的关系是 ( A) DB包含 DBS和 DBMS ( B) DBMS包含 DB和 DBS ( C) DBS包含 DB和 DBMS ( D)没有任何关系 11 下列关于 C+函数的说明中,正确的是 ( A)内联函数就是定义在另一个函数体内部的函数 ( B)函数体的最后一条语句必须是 return语句 ( C)标准 C+要求在调用一个函数之前,必须先声明其原型 ( D)编译器会根据函数的返回值类型和参数表来区分函数的不同重载形式 12 由于常对象不能被更新,因此 ( A)通过常对象只能调用它的常成员函数 ( B)通过常对象只能

4、调用静态成员函数 ( C)常对象的成员都是常成员 ( D)通过常对象可以调用任何不改变对象值的成员函数 13 下列关于虚函数的说明中,正确的是 ( A)从虚基类继承的函数都是虚函数 ( B)虚函数不得是静态成员函数 ( C)只能通过指针或引用调用虚函数 ( D)抽象类中的成员函数都是虚函数 14 运算符重载是对已有的运算符赋予多重含义,因此 ( A)可以对基本类型 (如 int类型 )的数据,重新定义 “+”运算符的含义 ( B)可以改变一个已有运算符的优先级和操作数个数 ( C)只能重载 C+中已经有的运算符,不能定义新运算符 ( D) C+中已经有的所有运算符都可以重载 15 模板对类型的

5、参数化提供了很好的支持,因此 ( A)类模板的主要作用是生成抽象类 ( B)类模板实例化时,编译器将根据给出的模板实参生成一个类 ( C)在类模板中的数据成员都具有同样类型 ( D)类模板中的成员函数都没有返回值 16 下列关于 C+流的说明中,正确的是 ( A)与键盘、屏幕、打印机和通信端口的交互都可以通过流类来实现 ( B)从流中获取数据的操作称为插入操作,向流中添加数据的操作称为提取操作 ( C) cin是一个预定义的输入流类 ( D)输出流有一个名为 open的成员函数,其作用是生成一个新的流对象 17 下列符号中可以用作 C+标识符的是 ( A) _radius ( B) foo b

6、ar ( C) else ( D) 3room 18 下列语句中,错误的是 ( A) const int buffer=256; ( B) const int temp; ( C) const double *point; ( D) const double *rt new double(5.5); 19 有如下程序: int x 3; do x 2; coutx; while(!(-x); 执行这个程序的输出结果是 ( A) 1 ( B) 30 ( C) 1-2 ( D)死循环 20 有如下程序: #include iostream using namespace std; int main

7、() int *p; *p 9; cout “The value at p: “ *p; return 0; 编译运行程序将出现的情况是 ( A)编译时出现语法错误,不能生成可执行文件 ( B)运行时一定输出: The value at p:9 ( C)运行时一定输出: The value at p:*9 ( D)运行时有可能出 错 21 有如下程序: #include iostream using namespace std; int main() void function(double val); double val; function(val); cout val; return 0

8、; void function(double val) val 3; 编译运行这个程序将出现的 情况是 ( A)编译出错,无法运行 ( B)输出: 3 ( C)输出: 3.0 ( D)输出一个不确定的数 22 有如下类定义: class AA int a; public: int getRef()constreturn 其中的四个函数定义中正确的是 ( A) ( B) ( C) ( D) 23 有如下程序: #include iostream using namespace std; class Base public: void fun() cout “Base:fun“ endl; ; c

9、lass Derived: public Base public: void tim() _ cout “Derived: fun“endl; ; int main() Derived d; d.fun(); return O; 已知其执行后的输出结果为: Base:fun Derived:fun 则程序中下划线处应填入的语句是 ( A) Base.fun(); ( B) Base:fun(); ( C) Base- fun(); ( D) fun(); 24 下面是重载为非成员函数的运算符函数原型,其中错误的是 ( A) Fraction operator+(Fraction, Fracti

10、on); ( B) Fraction operator-(Fraction); ( C) Fraction ( D) Fraction ( B) ifstream file(“d: ncretest.txt“); ( C) ifstream file; file.open(“d:ncretest.txt“); ( D) ifstream* pFile=new ifstream(“d:ncretest.txt“); 27 有如下类定义: class Foo public: Foo(int v): value(v) / Foo() / private: Foo() / int value=0; /

11、 ; 其中存在语法错误的行是 ( A) ( B) ( C) ( D) 28 有如下类定义: class Point int x_,y_; public: Point(): x_(0), y_(0) Point(int x, int y=0): x_(x), y_(y) ; 若执行语句 Point a(2), b3, *c4; 则 Point类的构造函数被调用的次数是 ( A) 2次 ( B) 3次 ( C) 4次 ( D) 5次 29 有如下类定义: class Test public: Test()a=0;c=0; / int f(int a)const this- a=a; / stati

12、c int g()return a; / void h(int b)Test:b=b; ; / private: int a; static int b; const int c; ; int Test:b=0; 在标注号码的行中,能被正确编译的是 ( A) ( B) ( C) ( D) 30 有如下程序: #include iostream using namespace std; class A public: A()cout“A; A()cout “ A“; ; class B: public A A*p; public: B()cout “B“; p=new A(); B()cout

13、“ B“; delete p; ; int main() B obj; return 0; 执行这个程序的输出结果是 ( A) BAA A B A ( B) ABA B A A ( C) BAA B A A ( D) ABA A B A 31 有如下程序: #include iostream using namespace std; class Base private: void funl()const cout“funl“; protected: void fun2() constcout “fun2“; public; void fun3() const cout “fun3“; ; c

14、lass Derived: protected Base public; void fun4() const cout “fun4“; ; int main() Derived obj; obj.funl(); / obj.fun2(); / obj.fun3(); / obj.fun4(): / return 0; 其中有语法错误的语句是 ( A) ( B) ( C) ( D) 32 有如下程序: #include iostream using namespace std; class Base public: void funl()cout“Basea“; virtual void fun

15、2()tout“Basen“; ; class Derived: public Base public: void funl() cout“Derivedn“; void fun2() cout“Derivedn“; ; void f(Base b.fun2(); int main() Derived obj; f(obj); return 0; 执行这个程序的输出结果是 ( A) Base Base ( B) Base Derived ( C) Derived Base ( D) Derived Derived 33 有如下程序 : #include iostream using names

16、pace std; class Complex double re, im; public: Complex(double r, double i): re(r), im(i) double real() const return re; double image() const return im; Complex im += a.im; return *this; ; ostream int main() Complex x(1,-2), y(2,3); cout (x+=y) endl; return 0; 执行这个程序的输 出结果是 ( A) (1,-2) ( B) (2,3) ( C

17、) (3,5) ( D) (3,1) 34 有如下程序: #include iostream #include iomanip using namespace std; int main() cout.fill(*); cout left setw(4) 123 “OK“ endl; return 0; ( A) 123*OK ( B) 123*OK* ( C) *123OK ( D) *123*OK 35 有如下类声明: class SAMPLE int n; public: SAMPLE(int i=0):n(i) void setValue(int nO); ; 下列关于 getValu

18、e 成员函数的实现中,正确的是 ( A) SAMPLE:setValue(int nO) n nO; ( B) void SAMPLE:setValue(int nO) n nO; ( C) void setValue(int nO) n nO; ( D) (int nO) n nO; 36 对长度为 10的线性表进行冒泡排序,最坏情况下需要比较的次数为【 】。 37 在面向对象方法中,【 】描述的是具有相似属性与操作的一组对象。 38 在关系模型中,把数据看成是二维表,每一个二维表称为一个【 】。 39 程序测试分为静态分析和动态测试。其中【 】是指不执行程序,而只是对程序文本进行检查,通过

19、阅读和讨论,分析和发现程序中的 错误。 40 数据独立性分为逻辑独立性与物理独立性。当数据的存储结构改变时,其逻辑结构可以不变,因此,基于逻辑结构的应用程序不必修改,称为【 】。 41 有一种只在循环语句或 switch语句中使用的流程控制语句,表示该语句的关键字是【 】。 42 程序中有如下语句 for(int i=0; i 5; 1+)cout *(p+i) “,“; 能够依次输出 int型一维数组 DATA的前 5个元素。由此可知,变量 p的定义及初始化语句是【 】。 43 若下面程序运行时输出结果为 1,A,10.1 2,B,3.5 #include iostream using na

20、mespace std; int main() void test(int, char, doubie【 】 ); test(1, A, 10.1 ); test(2, B); return 0; void test(int a, char b, double c) cout a , b , c endl; 44 有如下类声明 : class MyClass int i; private: int j; protected: int k; public: int m, n; ; 其中,私有成员的数量为【 】 。 45 有如下程序: #include iostream using namespa

21、ce std; class Con char ID; public: Con(): ID(W) cout l; Con(char ID): ID(ID) cout 2; Con(Con char getlD0const return ID; ; void show(Con c) cout c.getID(); int main() Concl; show(cl); Con c2(B); show(c2); return 0; 执行上面程序的输出是【 】。 46 有如下程序: #include iostream using namespace std; class ONE public: vir

22、tual void f() cout “1“; ; class TWO: public ONE public: TWO() cout “2“; ; class THREE: public TWO public: virtual void f() TWO:f(); cout “3“; ; int main() ONE aa, *p; TWO bb; THREE cc; p = P- f(); return 0; 执行上面程序的输出是【 】 47 有如下程序: #include iostream using namespace std; class PARENT public: PARENT()

23、cout “PARENT“; ; class SON: public PARENT public: SON() cout “SON“; ; int main() SON son; PARENT *p; p = return 0; 执行上面程序的输出是【 】。 48 若以非成员函数形式,为类 Bounce重载 “!”运算符,其操作结果为一 bool型数据,则该运算符重载函数的原型是【 】。 49 下面是复数类 complex的定义,其中重载的运算符 “+”的功能是返回一个新的复数对象,其实部等于两个操作对象实部之 和,其虚部等于两个操作对象虚部之和;请 补充完整: class complex d

24、ouble real; /实部 double imag; /虚部 public: complex(doubler, double i): real(r),imag(i) complex operator+(complex a) return complex(【 】 ); ; 50 已知一个函数模板定义为 template typename T1, typename T2 T1 FUN(T2 n)return n*5.0; 若要求以 int型数据 7为函数实参调用该模板函数,并返回一个 double型数据,则该调用应表示为【 】。 2006 年 4月国家二级( C+)笔试真题试卷答案与解析 1

25、【正确答案】 D 【试题解析】 结构化程序设计方法的主要原则有 4点:自顶向下 (先从最上层总目标开始设计,逐步使问题具体化 )、逐步求精 (对于复杂问题,设计一些 子目标作为过渡,逐步细化 )、模块化 (将程序要解决的总目标分解为分目标,再进一步分解为具体的小目标,每个小目标作为一个模块 )、限制使用 GOTO 语句。没有可复用原则,所以选项 D为答案。 2 【正确答案】 A 【试题解析】 本题考核模块独立性的评价。评价模块独立性的主要标准有两个:一是模块之间的耦合,它表明两个模块之间互相独立的程度,也 可以说是两个或两个以上模块之间关联的紧密程度 (所以,本题的正确答案为选项 A);二是模

26、块内部之间的关系是否紧密,称为内聚。一般来说,要求模块之间的耦合尽可能地弱,即模块尽可能独立,而要求模块的内聚程度尽量地高。 3 【正确答案】 D 【试题解析】 本题考核软件测试、软件调试和软件维护的概念。软件测试的目标是在精心控制的环境下执行程序,以发现程序中的错误,给出程序可靠性的鉴定。软件测试具有挑剔性,测试不是为了证明程序是正确的,而是在设想程序有错误的前提下进行的,其目的是设法暴露程序中的错误和缺陷,就是 说,测试是程序执行的过程,目的在于发现错误;一个好的测试在于能发现至今未发现的错误;一个成功的测试是发现了至今未发现的错误。由于测试的这一特征,一般应当避免由开发者测试自己的程序。

27、所以,选项 A的说法错误。 调试也称排错,目的是发现错误的位置,并改正错误,经测试发现错误后,可以立即进行调试并改正错误:经过调试后的程序还需进行回归测试,以检查调试的效果,同时也可防止在调试过程中引进新的错误。所以,选项 B的说法错误。 软件维护通常有 4类:为纠正使用中出现的错误而进行的改正性维护;为适应环境变化而进行的 适应性维护;为改进原有软件而进行的完善性维护;为将来的可维护和可靠而进行的预防性维护。软件维护不仅包括程序代码的维护,还包括文档的维护。文档可以分为用户文档和系统文档两类。但无论是哪类文档,都必须与程序代码同时维护。只有与程序代码完全一致的文档才有意义和价值。所以,选项

28、C的说法错误。 综上所述,选项 A、 B、 C的说法都错误,所以,选项 D为正确答案。 4 【正确答案】 B 【试题解析】 “后进先出 ”表示最后被插入的元素最先能被删除。选项 A中,队列是指允许在一端进行插入、而在另一端进行删除的线性表 ,在队列这种数据结构中,最先插入的元素将最先能够被删除,反之,最后插入的元素将最后才能被删除,队列又称为 “先进先出 ”的线性表,它体现了 “先来先服务 ”的原则;选项 B中,栈顶元素总是最后被插入的元素,从而也是最先能被删除的元素,栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。队列和栈都属于线性表,它们具有顺序存储的特点,所以才有 “先进先出

29、 ”和 “后进先出 ”的数据组织方式。双向链表使用链式存储方式,二叉树也通常采用链式存储方式,它们的存储数据的空间可以是不连续的,各个数据结点的存储顺序与数据元素之间的逻 辑关系可以不一致。所以选项 C和选项 D错误。 5 【正确答案】 A 【试题解析】 一个非空的数据结构如果满足下列两个条件: (1)有且只有一个根结点; (2)每一个结点最多有一个前件,也最多有一个后件。则称为线性结构。线性链表是线性表的链式存储结构,选项 A的说法是正确的。栈与队列是特殊的线性表,它们也是线性结构,选项 B 的说法是错误的;双向链表是线性表的链式存储结构,其对应的逻辑结构也是线性结构,而不是非线性结构,选项

30、 C的说法是错误的;二叉树是非线性结构,而不是线性结构,选项 D的说法是错误的。因此,本题 的正确答案为 A。 6 【正确答案】 D 【试题解析】 二叉树后序遍历的简单描述如下:若二叉树为空,则结束返回。否则 (1)后序遍历左子树; (2)后序遍历右子树; (3)访问根结点。 也就是说,后序遍历是指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后遍历右子树,最后访问根结点,并且,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后访问根结点。根据后序遍历的算法,后序遍历的结果为 DEBFCA。 7 【正确答案】 C 【试题解析】 在二叉树的第 k 层上,最多有 2k-1

31、(k1)个结点。对于满二叉树来说,每一层上的结点数都达到最大值,即在满二叉树的第 k层上有 2k-1个结点。因此,在深度为 7的满二叉树中,所有叶子结点在第 7层上,即其结点数为 2k-1=27-1=64 因此,本题的正确答案为 C。 8 【正确答案】 D 【试题解析】 本题考核实体集之间的联系。实体集之间的联系有 3种:一对一、一对多和多对多。因为一种商品可以由多个顾客购买,而一个顾客可以购买多种商品,所以, “商品 ”与 “顾客 ”两个实体集之间的联系一般是 “多对多 ”,选项 D正确。 9 【正确答案】 A 【试题解析】 在 E-R图中,用三种图框分别表示实体、属性和实体之间的联系,其规

32、定如下:用矩形框表示实体,框内标明实体名;用椭圆状框表示实体的属性,框内标明属性名;用菱形框表示实体间的联系,框内标明联系名。所以,选项 A正确。 10 【正确答案】 C 【试题解析】 数据库管理系统 DBMS是数据库系统中实现各种数据管理功能的核心软件。它负责数据库中所有数据的存储、检索、修改以及安全保护等,数据库内的所有活动都是在其控制下进行的。所以, DBMS 包含数据库 DB。操作系统、数据库管理系统与应用程序在一定的硬件 支持下就构成了数据库系统。所以, DBS包含 DBMS,也就包含 DB。综上所述,选项 C正确。 11 【正确答案】 C 【试题解析】 本题考查了函数的一些概念。内

33、联函数是在一般函数定义之前加上关键字 inline声明的函数,其作用类似于预处理宏函数,而不是定义在另一个函数体内部的函数,所以选项 A不正确。在无返回值函数中,执行完最后一条语句后将自动返回,而不必加入 return语句,所以选项 B 也是错误的。如果函数只是返回值类型不同,而其他完全相同 (参数个数及类型 ),则不能作为重载函数宋使用,所以选项 D不正确 。故应该选择 C。 12 【正确答案】 A 【试题解析】 本题考查了常对象与常成员函数的概念。使用 const关键字修饰的对象称为常对象,它的特点是不能被更新;使用 const关键字声明的成员函数称为常成员函数,它的特点也是不能更新对象的

34、数据成员。因为其他成员函数没有这个限制,即可以更新对象的数据成员,所以通过常对象只能调用常成员函数而不能调用其他成员函数,而且常成员函数也只能调用常成员函数而不能调用其他成员函数,否则它们的特性就会被打破。故应该选择 A。 13 【正确答案】 B 【试题解析】 本题考查的是虚函数的概念。在成员函数声明的前面加上 virtual修饰,即把该函数声明为虚函数。虚函数可以是另一个类的友员函数,但不得是静态成员函数。故应该选择 B。 14 【正确答案】 C 【试题解析】 本题考查的是运算符重载的概念。 “运算符重载 ”是针对 C+中原有运算符进行的,不可能通过重载创造出新的运算符。故应该选择 C。 1

35、5 【正确答案】 B 【试题解析】 本题考查了类模板实例化的概念。在定义对象的过程中,编译系统会自动地根据需要生成相应的类定义,这种依据类模板生成类定义的过程称为类模板的实例化。故应该选择 B。 16 【正确答案】 A 【试题解析】 本题考查的是 C+流的一些概念。从输入流中提取数据赋给一个变量的操作称为提取操作;而把表达式的值插入到输出流中的操作称为插入操作。故选项 B 的说法不正确。 cin 是一个预定义的输入流对象而不是流类,故选项 C不正确。只有文件流中有一个 open成员函数,用来打开一个文件,而输入、输出流中没有 open 成员函数,选项 D的说法不正确。所以,只有选项 A是正确的

36、,应该选择 A。 17 【正确答案】 A 【试题解析】 本题考查 C+语言中的标 识符的定义。标识符不是一个随意的字符序列,定义标识符时一般应注意如下几点:第一个字符必须是字母或下划线,中间不能有卒格,所以选项 D是错误的:在第一个字母后,可以是任意字母、下划线和数字组成的字符序列,所以选项 B 不正确:标识符的长度是任意的,但特定的编译系统能够识别的标识符长度是有限的。一般不要超过 31个字符:标识符中大小写字母是有区别的:用户定义标识符时,不要采用系统的保留字, else是系统保留字所以选项 C是错误的。故应该选择 A。 18 【正确答案】 B 【试题解析】 本题考查了符号常量的特点。符

37、号常量必须在声明的同时为其赋初值。因此选项 B 是错误的。选项 C定义的是一个指向常量的指针变量,即通过该指针不能改变它所指向的内容,而它自己的内容是可以改变的。定义指针符号常量的格式应该是: double*const point ;。所以选项 C是合法的,它可以不用在声明时赋初值。故应该选择 B。 19 【正确答案】 C 【试题解析】 本题考查的是 do-while循环。题目首先让 x=3,然后进入 do-while循环体, x被减去 2,接下来的语句输出 x的值 1。下面计算 do-while循环的条件表达 式 !(-x),由于 -运算符为前缀形式,所以 -X的值为 0,而 !0的结果为“

38、真 ”,此时 x的值变为 0,开始第二次执行循环体。 x又被减 2,输出 x的值 -2,此时 -x的值为 -3, !(-3)的值为 “假 ”,所以循环结束。最后程序的输出结果是 1-2,故应该选择 C。 20 【正确答案】 D 【试题解析】 本题考查的是指针的运用。在使用任何指针变量之前必须先给它赋一个所指合法具体对象的地址值。本题中,在给 *p 赋值前,指针变量 p 并没有指向一个具体对象。此时可以通过编译,但运行时由于 p 中为随机值,该赋值可能会破坏内 存中某个重要的地址空间中的内容,导致程序运行出错。故应该选择D。 21 【正确答案】 D 【试题解析】 本题考查的是函数参数的传递。在

39、C+中,函数在传递参数时,总是将实参值的副本传递 (拷贝 )给被调用函数的形参,即传值调用。因此,在函数中对形参所作的任何操作都不会改变函数外的实参。故本题 function()函数不会对主函数中的 val变量造成任何改变, val也没有被初始化,所以输出的是一个不确定的值:故应该选择 D。 22 【正确答案】 B 【试题解析】 本题考查了常成员函数和友员函数的一 些概念。 getRef()函数返回的是 a的地址值 &a,而函数类型却定义为 int, C+中不允许隐式的将一个地址值类型转换为 int类型,故选项 A不正确。 set()函数被定义为常成员函数,但在函数中给 a赋值,改变了数据成员

40、的值这是不允许的,故选项 C错误。 show()函数被定义为 AA类的友员函数,它不属于 AA类而是一个全局函数。所以同时被定义为常成员函数是错误的。所以选项 D不正确。故应该选择 B。 23 【正确答案】 B 【试题解析】 本题考查的知识点是继承的运用。题目中要求的两行输出结果分别在基类的成员函 数 fun()与派生类的成员函数 fun()中给出,而主函数中只通过派生类对象 d 调用 fun()函数,即只调用了派生类的成员函数 fun()。所以,横线处应该填入对基类成员函数 fun()的调用语句,此处只能使用作用域运算符 “:”才能调用到基类中的同名函数,故应该选择 B。 24 【正确答案】

41、 C 【试题解析】 本题考查的知识点是运算符重载。 C+中规定, “ ”运算符只能作为成员函数重载,故本题的选项 C是错误的。 25 【正确答案】 D 【试题解析】 本题考查的知识点是模板函数的调用。在调用一个模 板函数时,编译系统需要足够的信息来判别每个虚拟类型参数所对应的实际类型,可以从两个不同的渠道获得这样的信息:从模板的实参表 (用 括起来的参数表 )或从模板函数实参表 (用 (和 )括起来的参数表 ),模板实参的信息优先于函数实参的信息。如果从后者获得的信息已经能够判定其中部分或全部虚拟类型参数所对应的实际参数,而且它们又正好是参数表中最后的若干参数,则模板实参表中的那几个参数可以省

42、略。如果模板实参表中的实参都被省略了,则连空表 也可以不要。本题中 cast()函数的实参 i只能确定模板参数 u 的类型为 int,而不 能确定另外一个模板参数 T。故选项 A与 B 不正确。选项 C希望将 int转型为 char*, C+中不允许隐式的这样转换类型,所以也不正确。故应该选择 D。 26 【正确答案】 A 【试题解析】 本题考查的知识点是转义字符。在 C+的字符常量或字符串中,以“”开头的一系列字符被看作一个特殊的字符,即转义字符。要表示 字符时,必须使用转义字符 。故本题应该选择 A。 27 【正确答案】 D 【试题解析】 本题考查了类的定义。 C+语言规定,在类体中不允许

43、对所定义的数据成员进行初始化。故本题应 该选择 D。 28 【正确答案】 C 【试题解析】 本题考查的知识点是类的构造函数。构造函数在对象被创建的时候由系统自动调用。在 Point a(2), b3, *c4;语句中: a(2)是定义一个对象并传入构造参数 2,所以此时会调用 1次构造函数: b3是定义一个包含 3个对象的数组,所以构造函数会被调用 3次;而 *c4定义的是一个包含 4 个 Point类对象指针的数组,它并没有创建任何 Point对象,故构造函数一次也不会被调用。故应该选择 C。 29 【正确答案】 D 【试题解析】 本题考查 了类的定义。一个类的常数据成员的初始化只能在成员初

44、始化列表中进行,所以选项 A不正确。常成员函数不能更新对象的数据成员,所以选项 B 不正确。静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员,所以选项 C也不正确。故应该选择 D。 30 【正确答案】 B 【试题解析】 本题考查的是派生类对象的构造与析构。建立派生类对象时,构造函数的执行顺序如下: (1)执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序 (自左向右 ); (2)执行成员对象的构造函数,调用顺序按 照各个成员对象在类中声明的顺序 (自上而下 ); (3)执行派生类的构造函数。 所以本题在建立派生类 B 的对象。 obj时会先调用基类 A的构

45、造,然后调用自身的构造。注意: B类中定义的成员 p 是 A类的指针而不是一个对象,故在调用自身构造函数前不需要构造。而在 B类构造函数中使用 new操作符动态构造了一个A类的对象,所以整个构造结果是输出: ABA。派生类对象的析构与构造严格相反,即先析构自身,然后析构自身所包含的成员对象,最后调用基类的析构函数。故本题中,当 main()函数返回时,析构 B 类的对象 obj:首先会调 用 B(),接着再调用 A()。但是,在 B()函数中使用 delete操作符释放了动态创建的 A类对象,故整个析构所输出的结果是: B A A。所以应该选择 B。 31 【正确答案】 B 【试题解析】 本题

46、考查的知识点是保护继承。题目中的 Derived 类保护继承了Base类,因此 Base类中的公有成员与保护成员均成了 Derived 类的保护成员,而Base类的私有成员 Derived类不可访问。所以,主函数中通过 Derived类的对象只能够访问到 Derived 类的公有成员,即只能调用 fun4()函数。故 应该选择 B。 32 【正确答案】 B 【试题解析】 本题考查的是虚函数的概念。在 C+中,一个派生类的对象可以被它的任何一个基类的指针所指向 (或被基类类型的引用所引用 )。若基类和派生类中存在一模一样的成员函数,那么通过该基类指针 (或引用 )调用这样的成员函数,究竟是应该调用基类中的还是调用派生类中的呢 ?答案是:若这个成员函数被定义成虚函数,那么就调用派生类中的;否则会调用基类中的。本题是一个典型的例子, funl()是一般成员函数, fun2()是虚函数,而且在派生类

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试资料 > 职业资格

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1