1、国家二级( C+)机试模拟试卷 79及答案与解析 一、选择题 1 有如下类定义: class MyClass public: private: int data; ; 若要为 MyClass类重载流输入运算符 “,使得程序中可以 “cin obj;“的形式改变 MyClass类的对象 obj中数据成员 data的值,则横线处的声明语句应为 ( )。 ( A) friendistream ( B) friendistream ( C) istream ( D) istream 2 有如下程序: #include using namespace std; class A public: virtu
2、al void func1() coutfunc1(); p-func2(); delete p; return 0; 执行这个程序的输出结果是 ( )。 ( A) B1B2 ( B) A1A2 ( C) B1A2 ( D) A1B2 3 则关系 T是由关系 R和 S通过某种操作得到 ,该操作为 ( )。( A)选择 ( B)投影 ( C)交 ( D)并 4 有如下类定义: class Point private: static int how_many; ; how_many=0; 要初始化 Point类的静态成员 how_many,下画线处应填入的内容是 ( )。 ( A) int ( B
3、) staticint ( C) intPoint: ( D) staticintPoint: 5 下列模板声明中,有语法错误的是 ( A) templateTfun(Tx)returnx; ( B) templateTfun(Tx,intn)returnx*n; ( C) templateTfun(T*p)return*p; ( D) templateTclassATn; 6 下列枚举类型的定义中,包含枚举值 3的是 ( A) enumtestLEFT,UP,RIGHT,DOWN; ( B) enumtestLEFT,UP=5,RIGHT,DOWN; ( C) enumtestLEFT=-1
4、,UP,RIGHT,DOWN; ( D) enumtestLEFT,UP,RIGHT=6,DOWN; 7 如果派生类以 protected方式继承基类,则原基类的 protected成员和 public成员在派生类中的访问属性分别是 ( A) public和 public ( B) public和 protected ( C) protected和 public ( D) protected和 protected 8 已知一程序运行后执行的第一个输出操作是 cout using namespace std; class Cup public: Cup(double val=5.8):price
5、(val) void SetPrice(double val) price=val; double GetPrice() const return price; private: double price; ; int main() const Cup c1(4.5); Cup c2(29.8); c1.SetPrice(5.8); / c2.SetPrice(12.8); / c1.GetPrice(); / c2.GetPrice(); / return 0; 在标注号码的语句行中存在语法错误的是 ( A) ( B) ( C) ( D) 11 下列关于算法的描述中错误的是 ( A)算法强调
6、动态的执行过程,不同于静态的计算公式 ( B)算法必须能在有限个步骤之后终止 ( C)算法设计必须考虑算法的复杂度 ( D)算法的优劣取决于运行算法程序的环境 12 有如下程序: #include using namespace std; void fun(int i) cout using namespace std; int main() void function(double val); double val; function(val); cout using namespace std; int main() void function(double val); double va
7、l; function(val); cout T square(T x) return x * x; 其中 T是 ( )。 ( A)函数形参 ( B)函数实参 ( C)模板形 参 ( D)模板实参 22 有如下定义: int a 5 =1,3,5,7,9,*p=a; 下列表达式中不能得到数值 5的是 ( )。 ( A) a 2 ( B) a 3 ( C) *(p+2) ( D) *p+4 23 有如下程序: #include #include using namespace std; class MyBag public: MyBag(string br,string cr):brand(br
8、),color(cr) +count; MyBag() -count; static int GetCount() return count; private: string brand,color; static int count; ; _ int main() MyBag one(“CityLife“,“Gray“),two(“Micky“,“Red“); cout using namespace std; void f(int x, int x=y; y=z; int main() int x=0,y=1; f(x,y); cout T1 sum(T2, T3); double d1,
9、d2; 则下列调用中,错误的是 ( A) sum(d1,d2); ( B) sum(d1,d2); ( C) sum(d1,d2); ( D) sum(d1,d2); 27 有如下语句序列: int x=10, cout using namespace std; class Base public: void fun1() cout using namespace std; class Part public: Part(int x=0):val(x) cout usingnamespacestd; clasSClock public: Clock(unsignedlongi=0); void
10、set(unsignedlongi=0); voidprint()const; voidtick();时间前进一秒 Clockoperator+(); private: unsignedlongtotal_sec, seconds, minutes, hours, days; ; Clock: Clock(unsignedlongi) : totalsec(i), seconds(i 60), minutes(i 60) 60), hours(i 3600) 24), days(i 86400) voidClock: set(unsignedlongi) totalsec=i; seconds
11、: i 60; minutes=(i 60) 60; hours=(i 3600) 60; days=i 86400; ERROR*found* voidClock: print() cout usingnamespacestd; classString private: intsize;缓冲区大小 char*buf;缓冲区 public: String(intbufsize); voidStrcpy(char*s);将字符串 s复制到 bur中 voidPrint()const; String() if(bur!=NULL)deletebur; ; String: String(intbur
12、size) size=bursize; bur=newcharsize; *buf= 0; voidString: Strcpy(char*s) char*p*, *q; intlen=strlen(s); if(len+1size)缓冲区空间不够,须安排更大空间 size=len+1; p=q=newcharsize; *found* while(*q=*s)!=0)_ TODO:添加代码将字符串 s复制到字符指针 q中 deletebur; buf=p; else *found* for(p=bur; _; p+, s+); TODO:添加代码将字符串 s复制到 buf中 voidStri
13、ng: Print()const cout usingstd: ostream; usingstd: cout; usingstd: end1; claSSMyVector表示二维向量的类 doublex; x坐标值 doubley; y坐标值 public: MyVector(doublei=0 0, double; 0 0);构造函数 MyVectoroperator+(MyVectorj); 重载运算符 + friendMyVectoroperator-(MyVectori, MyVectorj);重载运算符 - friendostream&operator“,根据重载规则,本题答案为
14、A。 2 【正确答案】 C 【试题解析】 本题考查虚函数。虚函数指在基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。题中定义了一个派生类对象 B,并使用类 A的对象指针指向 B,由于基类 A中的 func1 为虚函数,所以会执行派生类的func1,输出 B1,而基类中的 func2不是虚函数,所以 p-func2()会执行基类的func2,输出 A2。故答案为 C。 3 【正确答案】 D 【试题解析】 在关系 T 中包含了关系 R与 S中的所有元组,所以进行的是并的运算。 4 【正确答案】 C 【试题解析】 本题考查静态数据成员,静态数据成员可以初始化,但只能在类体外
15、进行初始化,其一般形式为:数据类型类名 :静态数据成员名 =初值。所以本题答案为 C。 5 【正确答案】 D 【试题解析】 本题考查模板的定义, B选项中 x为 T 类型的, n为 int型的,但是 x*n 就不一定是 T类型的,所以错误。 6 【正确答案】 A 【试题解析】 枚举常量的定义 enum枚举类型名 常量 1,常量 2,常 量3, .; A选项包含的枚举值为 0、 1、 2、 3, B 选项包含的枚举值为 4、 5、 6、7, C选项包含的枚举值为 -1、 0、 1、 2, D选项包含的枚举值为 4、 5、 6、 7,所以 A选项正确。 7 【正确答案】 D 【试题解析】 本题考查
16、继承与派生,派生类中的成员访问基类中的成员由派生方式决定,派生类保护继承基类,那么基类中的私有成员不可访问,基类的保护成员和公用成员变成了派生类的保护成员。所以 D选项正确。 8 【正确答案】 B 【试题解析】 本题考查输入输出格式的控制,先是定义宽度为 10个字 符,然后填充字符, 1234只有四个字符,所以要在左侧填充 6个 *,即输出 *1234, B选项正确。 9 【正确答案】 A 【试题解析】 本题考查引用概念和使用,题目中 r为 x的引用,所以与 x的值相同,结果为 A, A选项正确。 10 【正确答案】 A 【试题解析】 本题考查常对象,常对象只能引用常成员函数,不能引用非常成员
17、函数,所以 是错误的。答案为 A选项。 11 【正确答案】 D 【试题解析】 算法是指对解题方案的准确而完整的描述,简单地说,就是解决问题的操作步骤。算法不同于 数学上的计算方法,强调实现, A选项叙述正确。算法的有穷性是指,算法中的操作步骤为有限个,且每个步骤都能在有限时间内完成, B选项叙述正确。算法复杂度包括算法的时间复杂度和算法的空间复杂度。算法设计必须考虑执行算法所需要的资源,即时间与空间复杂度,故 C选项叙述正确。算法的优劣取决于算法复杂度,与程序的环境无关,当算法被编程实现之后,程序的运行受到计算机系统运行环境的限制,故正确答案为 D选项。 12 【正确答案】 B 【试题解析】
18、程序中有三个重载 fun函数,形参类型分别为: int类型, double类型 和 char*类型, main 函数中,调用 fun 函数,实参为 0,编译器需要确定重载函数中的最佳匹配,虽然 0可以隐式转换为 double类型、 char*类型,但是 fun(0)可以和原型形参为 int类型的函数精确匹配,所以将会调用原型为 fun(int)的函数,输出 inti/;答案为 B。 13 【正确答案】 B 【试题解析】 构造函数不能指定返回类型,选项 C、 D错误;由于是在类定义体外定义函数,需要在函数名前给出函数的作用域,选项 A错误;答案为 B。 14 【正确答案】 D 【试题解析】 一个
19、非空的数 据结构如果满足以下两个条件:有且只有一个根结点;每一个结点最多有一个前件,也最多有一个后件,则称为线性结构,在数据结构中习惯称为线性表。 A选项中, 5为根结点,线性表为 51793。 B 选项中, 9为根结点,线性表为 97135。 C选项中, 1为根结点,线性表为 19753。 D选项,结点 1与 7都是根结点,属于非线性结构,故 D选项正确。 15 【正确答案】 D 【试题解析】 本题考查函数调用及传值方式传递参数,执行函数 function 时,并没有将 3的值传回来,而 val又没有初始化,所以会输出一个不确定的值, D选项正确。 16 【正确答案】 C 【试题解析】 类定
20、义体内部定义的函数,编译器都默认为内联函数,类定义体外部定义的函数,使用关键字 inline修饰的函数为内联函数,所以内联函数有:Wow(intn=0)、 incre()、 display(Woww),答案为 C。 17 【正确答案】 C 【试题解析】 C+中不能通过连接其他合法符号来创建任何新的操作符, A选项错误;除了函数调用操作符 operator()之外,重载操作符时使用默认实参是非法的, B选项错误;并不是所有操作符都可以重载为静态成员函数 ,比如赋值操作符 “=“只能重载为类的非静态成员函数,因为静态成员函数是面向整个类的,不属于某个类对象,所以静态成员函数只能操作类的静态数据成员
21、,而 “=“只能基于对象进行操作;另外操作符 “不能重载为类的成员函数,因为如果将这两种操作符重载为类的成员函数,左操作数将只能是该类类型的对象,这样的用法与正常 I/O 使用方式相反,为了支持正常用法,左操作数必须为标准库 I/O 内置类型,这又意味着如果该操作符重载为类的成员,那它必须是标准库内置类型的类成员,而标准库内置的类是不能人为添加成员的, D选项错误; 答案为 C。 18 【正确答案】 A 【试题解析】 派生类的对象结束生命周期时,系统先调用派生类的析构函数,然后按继承层次依次向上调用各个基类的析构函数,这是为了每次调用析构函数,都有完整的类对象与析构函数对应,当然如果某个类没有
22、定义析构函数,编译器会自动合成对应的析构函数并调用之,答案为 A。 19 【正确答案】 A 【试题解析】 对长度为 n 的线性表排序,最坏情况下时间复杂度,二分法查找为O( log2n);顺序查找法为 O( n);分块查找时间复杂度与分块规则有关;哈希查找时间复杂度为 O(1),因其通过计算 HashCode来定位元素位置,所以只需一次即可。故正确答案为 A选项。 20 【正确答案】 D 【试题解析】 本题考查函数调用及传值方式传递参数,执行函数 function 时,并没有将 3的值传回来,而 val又没有初始化,所以会输出一个不确定的值, D选项正确。 21 【正确答案】 C 【试题解析】
23、 本题考查模板函数的基本概念,根据模板函数的定义, T 是模板形参,所以答案为 C。 22 【正确答案】 B 【试题解析】 本题考查指向数组的指针,本题中指针变量 p 指向数组 a,直接 使用数组下标即可取值,数组下标是从 0开始标号的,所以 a 2能取到 5,而 a 3取不到 5, C选项中使用指针后移方法能够取到 5, D选项中 *p为 1,所以*p+4为 5。 23 【正确答案】 C 【试题解析】 本题考查构造函数和析构函数,以及静态数据成员,题目中要求输出 2,那么定义两个对象时,就执行构造函数,使得静态数据成员 +count,得到2,那么 count初始化就应该为 0,静态数据成员初
24、始化时,只能在类体外进行初始化,一边形式为:数据类型类型:静态数据成员名 =初值 24 【正确答案】 A 【试题解析】 详细设计的任务是为软件结构图中而非总体结构图中的每一个模块确定实现算法和局部数据结构,用某种选定的表达工具表示算法和数据结构的细节,所以 A)错误。 25 【正确答案】 A 【试题解析】 参数传递有三种: 传值 (value),传址 (address),和传引用 (reference) 传值时子函数(被调用者)复制父函数(调用者)传递的值,这样子函数无法改变父函数变量的值。 传址时父函数将变量的地址传递给子函数,这样子函数可以能过改写地址里的内容改变父函数中的变量。传引用则是
25、一种看起来像传 值调用,而实际上功能同传址一样的传递方式。子函数可以改写父函数的变量值。本题中函数 f 中第一个参数为传值调用,第二个参数为传引用,其中 y的值在执行完函数 f就变为了 x值,所以输出 00, A选项正确。 26 【正确答案】 D 【试题解析】 本题考查函数模板的定义和使用,编译器无法推演出 T1的类型,D选项里没有写明 T1的类型,而 sum函数需要 T1的类型去特化出一个函数能够处理 d1和 d2这两个参数的函数。其他的都可以。 27 【正确答案】 A 【试题解析】 本题考查引用概念和使用,题目中 r为 x的引用 ,所以与 x的值相同,结果为 A, A选项正确。 28 【正
26、确答案】 B 【试题解析】 本题考查默认析构函数,题中定义了一个对象和包含 2个元素的一维对象数组,而对象指针不占用空间,对象引用也不会占用内存空间,所以不调用构造函数,那么析构函数就执行 3次,答案为 B。 29 【正确答案】 B 【试题解析】 常用的黑盒测试方法和技术有:等价类划分法、边界值分析法、错误推测法和因果图等。基本路径测试属于白盒测试,故正确答案为 B选项。 30 【正确答案】 D 【试题解析】 函数 calc()声明的 形参表后面有关键字 const,说明该函数是常成员函数,常成员函数改变了隐含的 this 形参的类型,使得 this 是指向 const对象的指针,因而该函数只
27、能读取数据成员的值,不能修改数据成员,所以 D选项错误,答案为 D。 31 【正确答案】 D 【试题解析】 双向链表与二叉链表均是有两个指针域的链表, A选项错误。在单链表的第一个结点前增加一个表头结点,队头指针指向表头结点,最后一个结点的指针域的值由 NULL 改为指向表头结点,这样的链表称为循环链表。循环队列是队列的一种顺序存储结构。循环链表与循环队列是两种 存储结构, B 选项错误。双向链表结点有两个指针域,指向前一个结点的指针和指向后一个结点的指针,而带链的栈是单链表形式, C选项错误。故正确答案为 D选项。 32 【正确答案】 C 【试题解析】 函数 huiwen 通过递归地比较字符
28、串 s的首尾字符是否相等,来判断字符串 s是否是回文串,所以字符串 “radar“需要判断 “radar“的首尾字符、“ada“的首尾字符、 “d“的首尾字符,函数 huiwen 需要被调用 3次,答案为 C。 33 【正确答案】 B 【试题解析】 在某基类中声明为 virtual 并在一个 或多个派生类中被重新定义的成员函数,本题中定义了一个派生类对象 obj,执行 f函数后,将派生类对象 obj转化为基类对象,由于 fun1不是虚函数,所以输出基类的 fun1;而 fun2是虚函数,所以输出派生类的 fun2,所以本题答案为 B。 34 【正确答案】 D 【试题解析】 本题考查 C+关键字
29、,属于基本常识,显然 D选项不正确。 35 【正确答案】 B 【试题解析】 本题考查带参数的构造函数。本题中定义了一个对象 obj,那么执行其构造函数,初始化 p1,p2的顺序是由声明这两个成员的顺序决定的, 而不是由参数化列表顺序决定,所以本题中,会先执行 p1,输出 2,然后执行 p2输出 1,然后输出 3,最后一次输出 312。所以本题答案为 B。 36 【正确答案】 D 【试题解析】 数据库系统的三级模式是概念模式、外模式和内模式,所以选择D)。 37 【正确答案】 D 【试题解析】 本题考查继承与派生,派生类中的成员访问基类中的成员由派生方式决定, 如果派生类私有继承基类,那么就不能新定义的成员函数就不能访问基类的私有成员,所以 A选项错误。在私有继承的情况下,派生类中新定义的成员函数可以访问基类的 保护成员。 基类对象在某种情况下可以赋值给派生类对象。 38 【正确答案】 A 【试题解析】 在数据流图中,对所有元素都进行了命名,所有名字的定义集中起来就构成了数据字典。因此选 A,而 B, C, D都不符合。 39 【正确答案】 D