1、国家二级( C+)机试模拟试卷 85及答案与解析 一、选择题 1 有如下函数模板: template T cast(U u) return u; 其功能是将 U类型数据转换为 T类型数据。已知 i为 int型变量,下列对模板函数cast的调用中正确的是 ( )。 ( A) cast(i); ( B) cast1; -i) cout using namespace std; class Base public: void fun1() cout using namespace std; class Base public: Base() cout1;i-=2)coutgetPI();和 cout
2、getPI();和 coutgetPI(); ( D) cout using namespace std; void fun(int x=y/4; x+; int main() int x=4,y=5; fun(x,y); cout using namespace std; class AA public: AA(int n) cout using namespace std; class Sample friend long fun(Sample s); public: Sample(long a) x = a; private: long x; ; long fun(Sample s) i
3、f (s.x usingnamespacestd; classHome “住宅 “类 char*addresS;地址 char*owner;业主姓名 public: EFRROR*found* Home(constchar*ad=NULL, constchar*ow) EFRROR*found* if(ad=NULL) address=NULL; else address=newcharstrlen (ad)+1; strcpy(address, ad); if(OW=NULL) owner=NULL; else owner=newcharstrlen(ow)+1; strcpy(owner,
4、 ow); Home()t if(address)deleteaddress; ERFOR*found* if(owner)deleteowner; constchar*getAdress()const returnaddress, constchar*getOwner()constreturnowner; ; intmain() Homemyhome(“南 21条 12号 “, “李四 “); cout #include usingnamespacestd; classPerson public: charname20; intage; char*address, public: Perso
5、n(char*_name, int_age, char*_add=NULL);构造函数 voidinfo_display();人员信息显示 Person();析构函数 ; voidwriteToFile(constchar*path =“); proj3 cpp #include #include #include“proj3 h“ usingnamespacestd; Person: Person(char*_name, int_age, char*_add): age(_age) 把字符串 name复制到数组 name中 使 address指向一个动态空间,把字符串 _ add复制到该数组
6、中。 *333* *666* voidPerson: info_display() coutinfo_display(); deletep2; writeToFile(“); 国家 二级( C+)机试模拟试卷 85答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 本题考查函数模板的基本运用,属于基础知识。函数模板实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型代表,这个通用函数就是函数模板。函数模板可以设定默认参数,这样在调用模板函数时就可以省略实参,函数模板的实例就是一个函数的定义。所以本题答案为D。 2 【正确答案】 B 【试题解析】 本题考查 for循
7、环语句, -i表示用之前先减 1,那么这个 for循环语句只有 50到 2时才会输出 “*“,所以总共输出 49次。 3 【正确答案】 D 【试题解析】 本题考查保护继承中派生类对基类的访问属性,在受保护继承中,基类的公用成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有,所以本题答案为 D。 4 【正确答案】 D 【试题解析】 本题考查控制输出格式, A、 B、 C选项都会输出 “12345“,只有 D选项输出 “12345“,所以本题答案为 D。 5 【正确答案】 A 【试题解析】 本题考查二维字符数组, a0=“AAA“中 a0表示一个地址,不能将字符串直接赋值 给指针,所以
8、A选项错误。 6 【正确答案】 A 【试题解析】 本题考查派生类的构造函数,其一般形式为:派生类构造函数名(总参数表列) :基类构造函数名(参数表列)所以只有选项正确。 7 【正确答案】 D 【试题解析】 队列的修改是依先进先出的原则进行的, D正确。 8 【正确答案】 B 【试题解析】 函数 f1调用 f2,如果 f2定义在 f1之后,那么必须将 f2的函数原型声明放在 f1之前,如果 f2定义在 f1之前,那么不需要 f2函数原型声明。所以B 选项正确。 9 【正确答案】 D 【试题解析】 当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给
9、函数,所以 正确使用 this指针。而 为静态成员,没有 this 指针,答案为 D选项。 10 【正确答案】 D 【试题解析】 软件具有以下特点:软件是一种逻辑实体,具有抽象性;软件没有明显的制作过程;软件在使用期间不存在磨损、老化问题;对硬件和环境具有依赖性;软件复杂性高,成本昂贵;软件开发涉及诸多的社会因素,如知识产权等。故选项 D正确。 11 【正确答案】 C 【试题解 析】 流运算符 “不能重载为类的成员函数,因为一旦该操作符重载为类的成员函数,那么左操作数将只能是该类类型的对象,这样的用法与正常 I/O使用方式相反。为了支持正常用法,左操作数必须为 ostream类型。但是,标准库
10、中的类是不能人为添加成员的,答案为 C。 12 【正确答案】 C 【试题解析】 定义类模板时,模板形参表同样使用尖括号括起来,答案为 C。 13 【正确答案】 A 【试题解析】 结构化程序的三种基本控制结构:顺序、选择和重复,故 A选项正确。 14 【正确答案】 C 【 试题解析】 函数 huiwen 通过递归地比较字符串 s的首尾字符是否相等,来判断字符串 s是否是回文串,所以字符串 “radar“需要判断 “radar“的首尾字符、“ada“的首尾字符、 “d“的首尾字符,函数 huiwen 需要被调用 3次,答案为 C。 15 【正确答案】 B 【试题解析】 在某基类中声明为 virtu
11、al 并在一个或多个派生类中被重新定义的成员函数,本题中定义了一个派生类对象 obj,执行 f函数后,将派生类对象 obj转化为基类对象,由于 fun1不是虚函数,所以输出基类的 fun1;而 fun2是虚函数, 所以输出派生类的 fun2,所以本题答案为 B。 16 【正确答案】 D 【试题解析】 在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。对任何一棵二叉树,度为 0的结点(即叶子结点)总是比度为 2的结点多一个。叶子结点有 435个,则度为 2的结点为 434, D选项正确。 17 【正确答案】 B 【试题解析】 派生类构造函数在构造派生类过程中,首先
12、初始化基类,然后根据声明次序初始化派生类的成员,最后执行函数体;析构函数在程序结束时负责撤销自己的成员,首先运行派生类析构 函数,然后按继承层次依次向上调用各基类析构函数;在 main 函数中,创建 Derived 类对象 obj,此时调用 Derived的构造函数,构造函数在进入函数体之前,又调用基类 Base的构造函数构造基类,由于Derived中没有数据成员,所以构造完基类,执行函数体,输出为: “BD“;撤销obj对象时,首先执行 Derived的析构函数,然后调用基类的析构函数,输出为“db“;答案为 B。 18 【正确答案】 C 【试题解析】 在树结构中,一个结点所拥有的后件个数称
13、为该结点的度,所有结点中最大的度称为树的度。对 任何一棵二叉树,度为 0的结点(即叶子结点)总是比度为 2的结点多一个。二叉树共有 845个结点,度为 0的结点有 45个,度为1的结点数为 n1,度为 2的结点数为 n2,则 845=45+n1+n2,且 45=n2+1,则n1=756, C选项正确。 19 【正确答案】 B 【试题解析】 首先赋值运算符只能重载为成员函数,以便编译器可以知道是否需要合成一个,选项 A、 D错误;另外赋值运算符是二元运算符,左操作数是调用该赋值运算符的类对象,所以赋值运算符的重载函数的形参只需要右操作数,选项 C中有两个形参,错误;答案为 B。 20 【正确答案
14、】 A 【试题解析】 程序中的 typename都可以替换为 class,但程序中的 class 不可以全部替换为 typename。在模板类型形参中除了 typename和 class 以外,也可以用常规类型来声明参数的类型,所以 C、 D选项错误。 21 【正确答案】 B 【试题解析】 本题考查 for循环语句,题目中每执行完循环体后, i都会减 2,那么只有 50到 2之间的偶数才能输出 “*“,所以总共输出 25次。 22 【正确答案】 D 【试题解析】 本题考查静态成员函数。静态成 员函数由于没有 this指针,所以不能访问本类中的非静态成员。引用静态成员函数有 2种方式,一种是直接
15、使用类来引用,即 Constants:getPI();另一种是使用对象来引用,即constants.getPI( )。所以本题答案为 D。 23 【正确答案】 D 【试题解析】 需求分析阶段的工作有:需求获取;需求分析;编写需求规格说明书;需求评审,所以选择 D)。 24 【正确答案】 C 【试题解析】 本题考查类的定义,类定义中不能包含自己本身的对象 ,否则会引起像无限递归的问题,结果就 是内存被消耗殆尽。所以 C选项错误。 25 【正确答案】 D 【试题解析】 本题考查模板的相关知识,一个类模板可以有多个类型参数。所以D选项错误。 26 【正确答案】 D 【试题解析】 本题考查除号 /,当
16、除号两边都是整数时,得出的结果为整数, 2/3等于 0,所以结果为 0, D选项正确。 27 【正确答案】 D 【试题解析】 当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数,所以 正确使用 this指针。而 为静态成员,没有 this 指针,答案为 D选项。 28 【正确答案】 A 【试题解析】 数据模型通常由数据结构、数据操作及数据约束部分组成。故 A选项正确。 29 【正确答案】 D 【试题解析】 C+中,静态成员是类的组成部分,不是任何对象的组成部分,因此静态成员函数没有 this 指针,类的非 const成员函数包括静态成员函数
17、,所以选项 A、 C错误;答案选 B 或 D。 30 【正确答案】 B 【试题解析】 二叉树遍历可以分为 3种:前序遍历(访问根结点在访问左子树和访问右子树之前)、中序遍历(访问根结点在 访问左子树和访问右子树两者之间)、后序遍历(访问根结点在访问左子树和访问右子树之后)。本题中前序序列为 ABCD,中序序列为 DCBA,可知 D为根结点, ABC为左侧结点, C为 D左子结点, A为 B子结点,故后序序列为 DCBA,故 B选项正确。 31 【正确答案】 C 【试题解析】 函数 fun 两个形参 x, y都是引用类型,函数功能是通过形参的引用类型修改实参值,首先修改 y值为 x、 y之和;然
18、后将修改后的 y值除以 4,结果赋给 x,再将 x自增 1; main 函数中定义 x=4, y=5,通过 fun函数的调用,修改 y的值为 4+5=9, x的值为 9/4+1=3,最终输出结果为 3,9,答案为 C。 32 【正确答案】 D 【试题解析】 构造函数初始化列表仅指定用于初始化成员的值,并不指定这些初始化执行的次序;初始化执行的次序是根据类定义中成员的声明顺序完成的,初始化列表结束后,再执行函数体;程序创建 CC 对象 c,调用 CC的构造函数,由于在类 CC中, AA类对象 a首先声明,所以先调用 AA类的构造函数,完成成员a的初始化,输出 “1“,再调用 BB类的构造函数,完
19、成成员 b的初始化,输出“2“,最后执行 CC构造函数的函数体,输出 “3“;答案为 D。 33 【正确答案】 D 【试题解析】 本题考查 C+标识符的命名规则,其规则有如下几点: 所有标识符必须由字母、数字或下画线组成,且必须由字母或下画线开头; 所有标识符不能使用 C+已有的关键字; 大、小写字母表示不同意义,即代表不同的标识符。选项 C中虽然 return是关键字,但因首字母大、小写不同,也可用于标识符,但不建议使用。故答案为 D。 34 【正确答案】 C 【试题解析】 本题考查默认构造函数,当 i=0、 1时, fun(Sample(i)为 1;当 i=2时, fun(Sample(i
20、)为 2;当 i=3时, fun(Sample(i)为 6;当 i=4 时, fun(Sample(i)为 24;当 i=5时, fun(Sample(i)为 120。所以总和为 154。 35 【正确答案】 C 【试题解析】 因为一个人可以操作多个计算机,而一台计算机又可以被多个人使用,所以两个实体之间是多对多的关系。 36 【正确答案】 A 【试题解析】 本题考查虚函数,在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数成为虚函数,虚函数不得是静态成员函数,但可以是友元函 数。 37 【正确答案】 A 【试题解析】 软件按功能可以分为:应用软件、系统软件、支撑软件
21、。操作系统、编译程序、汇编程序、网络软件、数据库管理系统都属于系统软件。所以B)、 C)、 D)都是系统软件,只有 A)是应用软件。 38 【正确答案】 B 【试题解析】 本题考查对象的定义,定义一个类对象就需要占用空间,其中c1、 c3 都占用了空间, c2、 c4 为指针只占一个指针空间,所以 B选项正确。 39 【正确答案】 A 【试题解析】 结构化程序设计的思想包括:自顶向下、逐步求精、模块化、限 制使用 goto语句,所以选择 A)。 40 【正确答案】 D 【试题解析】 函数 calc()声明的形参表后面有关键字 const,说明该函数是常成员函数,常成员函数改变了隐含的 this
22、 形参的类型,使得 this 是指向 const对象的指针,因而该函数只能读取数据成员的值,不能修改数据成员,所以 D选项错误,答案为 D。 二、基本操作题 41 【正确答案】 (1)Home(constchar*ad=NULI, constchar*ow=NULL)或Home(constchar*ad, constchar*ow) (2)if(ad=NULL) (3)if(owner)deleteowner; 【试题解析】 (1)主要考查考生对构造函数默认参数的掌握,如果有一个形参具有默认实参,那么它后面所有的形参都必须有默认实参。 Home构造函数中 ad 具有默认实参,所以 ow也必须有
23、默认实参。 (2)主要考查考生对赋值操作符和相等操作符区别的掌握,在 if语句的判断条件中,使用赋值操作符时,表达式值始终为 true,这里需要修改为相等操作符。 (3)主要考查考生对动态分配的掌握,在 Home 构造函数中,使用 newchar对owner动态分配内存,那么在析构函数中,必须对应使用 deleteowner释放内存。 三、简单应用题 42 【正确答案】 (1)x1(root1), x2(root2), num_of_roots(2) (2)num_of_roots (3)a(x.a), b(x.b), c(x.c) (4)return Root() 【试题解析】 (1)主要考
24、查考生对构造函数的掌握 ,应使用成员列表初始化。 (2)主要考查考生对 switch 语句的掌握 ,使用 num_of_roots 判断根的信息 。 (3)主要考查考生对构造函数的掌握 ,应使用成员列表初始化。 (4)主要考查考生对成员函数的掌握 ,结合数学知识可知 ,当 delta0.0时 ,方程式无解。 四、综合应用题 43 【正确答案】 strcpy(name,_name); address = new charstrlen(_add) + 1; strcpy(address,_add); 【试题解析】 主要考查考生对构造函数的掌握 ,根据题目要求 ,首先使用 strcpy()函数把字符串 _name复制到数组 name中 ,然后使用 new语句分配一个动态空间 ,使address 指向空间首地址 ,最后把字符串 _add复制到该数组中。