1、国家二级( C+)笔试模拟试卷 234及答案与解析 1 2 3 算法的有穷性是指 ( )。 ( A)算法程序的长度是有限的 ( B)算法程序所处理的数据量是有限的 ( C)算法程序的运行时间是有限的 ( D)算法只能被有限的用户使用 4 有如下程序: #include iost earn using namespace std; class TestClass protected: TestClass()cout x; TestClass(char C) coutc; ; class TestClass1:public TestClass public: TestClass1(char C)
2、Cout c;) ; int main() TestClass1 d1(y); return 0; 执行这个程序,屏幕上将显示输出 ( )。 ( A) y ( B) yx ( C) xy ( D) yy 5 数据库系统的核心是 ( )。 ( A)数据库 ( B)数据库管理系统 ( C)数据模型 ( D)软件工具 6 在顺序表 (3, 6, 8, 10, 12, 15, 16, 18, 21, 25, 30)中,用二分法查找关键码值 11,所需的关键码比较次数为 ( ) ( A) 2 ( B) 3 ( C) 4 ( D) 5 7 下列关于 switch 语句的描述中, ( )是正确的。 ( A)
3、 switch语句中 default子句可以没有,也可有一个 ( B) switch语句中每个语句序列中必须有 break语句 ( C) switch语句中 default 子 句只能放在最后 ( D) switch语句中 case 子句后面的表达式只能是整型表达式 8 下列对重载函数的描述中, ( )是错误的。 ( A)重载函数中不允许使用默认参数 ( B)重载函数中编译是根据参数表进行选择 ( C)不要使用重载函数来描述毫无相干的函数 ( D)构造函数重载将会给初始化带来多种方式 9 若二维数组 a有 m列,则计算任一元素 aij在数组中相对位置的公式为 (假设 a0 0位于数组的第一个位
4、置上 ) ( )。 ( A) i*m+j ( B) j*m+i ( C) i*m+j-1 ( D) i*m+j+1 10 下列有关程序设计的原则中错误的是 ( A)对所有的输入数据都要检查数据的合法性 ( B)输入一批数据时,最好使用数据结束标志 ( C)对于不好的程序,尽量重新编写,避免修补 ( D)输出数据要干净,避免加注释 11 有如下程序: #include iostream using namespace std; class A public: A()cout “A“; A()cout “ A“; ; class B:public A A*p; public: B()cout “B
5、“;p=new A; B()cout “ 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 12 有如下 程序: #include iostream using namespace std; class A public: virtual void func1()cout “A1“; void func2()cout “A2“; ; class B:public A public: void func1
6、()cout “B1“; void func2()cout “B2“; ; int main() A *p=new B; p- func1(); p- func2(); return 0; 执行该程序,屏幕上将显示输出 ( )。 ( A) B1B2 ( B) A1A2 ( C) B1A2 ( D) A1B2 13 有如下程序: #include iostream Using namespace std; Class TestClass private: int X, y; public: TestClass(int i, int j) x i; y j; void print() cout “
7、printl” endl; void print()const cout “print2”endl; ; int mai ( A) print1 ( B) print2 ( C) print1 print2 ( D)程序编译时出错 14 已知 char a iht b; float c; double d;则表达式 a*b+c-d结果为 ( )。 ( A) double ( B) int ( C) float ( D) char 15 有如下函数模板声明: template typename T T Max(T a,T b)return(a =b)? a:b; 下列对函数模板 Max( )的调
8、用中错误的是 ( A) Max(3.5,4.5) ( B) Max(3.5,4) ( C) Max double (3.5,4.5) ( D) Max double (3.5,4) 16 当需要将一个函数 bool isnumber(char c)声明为内联函数时,则此内联函数的函数原型为 ( )。 ( A) enum bool isnumber(char c); ( B) define bool isnumber(char c); ( C) inline bool isnumber(char c); ( D) extem bool isnumber(char c); 17 在位运算中,操作数
9、每右移一位,其结果相当于 ( A)操作数乘以 2 ( B)操作数除以 2 ( C)操作数乘以 4 ( D)操作数除以 4 18 下面叙述不正 确的是 ( A)基类的保护成员在派生类中仍然是保护的成员 ( B)基类的保护成员在公有派生类中仍然是保护的 ( C)基类的保护成员在私有派生类中仍然是私有的 ( D)对基类成员的访问必须是无二义性 19 下面的描述中,正确的是 ( )。 ( A) virtual可以用来声明虚函数 ( B)含有纯虚函数的类是不可以用来创建对象的,因为它是虚基类 ( C)即使基类的构造函数没有参数,派生类也必须建立构造函数 ( D)静态数据成员可以通过成员初始化列表来初始化
10、 20 有如下程序: #include using namespace std; classA public: A0coutfun( 23 关于虚函数下面说的正确的是 ( )。 ( A)若在重定义虚函数时使用了 virtual,则该重定义函数还是虚函数 ( B)虚函数不能声明为友元 ( C)子类必须重定义父类的虚函数 ( D)虚函数不能是 static的 24 定义如下变量: char one_char;,则语句 cout one_char;显示结果相当于 C语言中的 ( )语句。 ( A) printf(one_char); ( B) prinff(“%c“,one_char); ( C)
11、scanf(one_char); ( D) scanf(“%c“,) ; class Derived: public Base public: Derived(char c)cout c;) ; int main() Derived dl(B); return 0; 执行这个程序屏幕上将显示输出 ( )。 ( A) B ( B) BA ( C) AB ( D) BB 26 对于类定义 classA public: virtual void func1() void func2() ; Class B: public A public: void funcl()cout ”class B fun
12、c1” end1; virtual void func2()cout “class B func 2“ end1; ; 下面正确的叙述是 ( A) A func2()和 B funcl()都是虚函数 ( B) A func2()和 B funcl()都不是虚函数 ( C) B funcl()是虚函数,而 A func2()不是虚函数 ( D) B funcl()不是虚函数,而 A func2()是虚函数 27 在 C+语言中,数据封装要解决的问题是 ( A)数据的规范化 ( B)便于数据转换 ( C)避免数据丢失 ( D)防止不同模块之间数据的非法访问 28 函数模板: template cl
13、ass T T add(T x, T y)return x+y; 下列对 add 函数的调用不正确的是 ( A) add (1, 2) ( B) add int (1, 2) ( C) add (1.0, 2) ( D) add(1.0, 2.0) 29 若类 A和类 B的定义如下: class A int i,j; public: int geti() return i; ; class B: public A int k; public: void make() k=i*j; ; 则上述定义中非法的表达式是 ( A) k=i*j ( B) int k; ( C) retum i; ( D)
14、 void make() 30 在函数声明中,下面哪项是不必要的 ( )。 ( A)函数参数的类型和参数名 ( B)函数名 ( C)函数的类型 ( D)函数体 31 下列关于类与对象的说法中,不正确的是 ( )。 ( A)对象是类的一个实例 ( B)任何一个对象只能属于一个具体的类 ( C)一个类只能有一个对象 ( D)类与对象的关系和数据类型与变量的关系相似 32 C+语言类体系中,不能被派生类继承的有 ( A)转换函数 ( B)构造函数 ( C)虚函数 ( D)静态成员函数 33 下面程序的运行结果为 #include iostream.h class A int num; public:
15、 A(int i)num=i; A(A const int con; Sample(int m) con=m+1;n=m; void disp( ) cout “normal:n=“ n endl; void disp( )const cout “static:n=“ n endl; ; void main( ) const Sample a (12); Sample b (13); a.disp( ); b.isp( ); cout a.n “,“ b.con endl; 43 C+中,派生类继承了基类的全部数据成员和除【 】之外的全部函数成员。 44 将一个函数声明为一个类的友元函数必须使
16、用关键字【 】。 45 以下程序的输出结果是【 】。 #include iostream. h void main() char *x6 = “Would“ , “you“ , “like“ , “C“ “Plus“ “Plus“ int i=0; while (i 4) if (i=3) cout xi “?“ ; else cout xi “ “; i+; cout end1; 46 构造函数是和【 】同名的函数。 47 将 x+y中的 +运算符用友元函数重载应写为【 】。 48 下面程序的结果为 【 】 。 #include iostream.h void main( ) int a=1
17、, b=2; bool c=1; if(a b) |c) cout “true“ end1; else cout “false“ end1; 49 执行 “cout char(A+2) end1;“语句后得到的输出结果为【 】。 50 在 C+类的规定中:静态函数只能给引用类的静态成员和【 】。 国家二级( C+)笔试模拟试卷 234答案与解析 1 【正确答案】 B 2 【正确答案】 D 【试题解析】 本题考查数据结构中队列的基本知识。队列是一种限定性的线性表,它只允许在表的一端插入元素,而在另一端删除元素,所以队列具有先进先出的特性。在队列中,允许插入元素的一端叫做队尾,允许删除元素的一端则
18、 称为队头。 3 【正确答案】 C 4 【正确答案】 C 【试题解析】 程序中的类 TestClass 为基类, TestClass1为 TestClass 的派生类。由 main 主函数入手,定义 TestClass1类型的对象 d1,参数值为 y。 TestClass1类继承 TestClass,所以主函数中 “TestClass1 d1(y);”语句首先调用调用基类中的“TestClass()cout x;)”输出 x,然后调用 “TestClass1(char C) cout c;”输出 y,即 答案为 “xy”。 5 【正确答案】 A 【试题解析】 数据库系统由这样几部分组成:数据库
19、 (数据 )、数据库管理系统 (软件 )、数据库管理员 (人 )、硬件平台、软件平台。这五个部分构成了一个数据库系统,而其中数据库是整个系统的核心。 6 【正确答案】 C 【试题解析】 二分法查找首先用想要查找的关键词 k 与中间位置的节点关键词相比较,这个中间节点把线性表分成了两个子表,若比较结果相等,则查找完成:若不等,再根据 k与中间节点关键词的比较大小确定下一步查找哪个子表,这样递归下去,直到找到满足条件的节点 ,或者该线性表中没有这样的节点。本题中第 1次和 15比较:第 2次和 7比较:第 3次和 10比较:第 4次和 12 比较:比较后结束,没找到 7 【正确答案】 A 8 【正
20、确答案】 A 9 【正确答案】 A 10 【正确答案】 D 【试题解析】 在程序设计中,优良的风格要求在输出中加入必要的注释因此,选项 D)中的说法是不对的。 11 【正确答案】 B 【试题解析】 此题考查的是类的构造函数和析构函数派生类构造函数的执行顺序;首先调用基类的构造函数,调用顺序按它们被继承时说明的顺序;然后 调用子对象的构造函数,调用顺序按它们在类中说明的顺序;最后是派生类构造函数中的内容因此本题中,首先调用基类构造函数输出 A,然后调用子对象的构造函数输出 B, p=new A再调用类 A的构造函数输出 A;析构函数的调用顺序和构造函数的调用顺序相反。 12 【正确答案】 C 【
21、试题解析】 程序中 B 为 A的派生类,由主函数入手,主函数中定义了类 A的指针 p指向类 B。根据基类中的 “virtual void func1()”知道 A中的 func1为虚函数,执行 “p- func1(); ”语句,通过指针变量调用此虚函数 ,此时调用的就是指针变量指向的同名函数,即派生类的 func1 函数,输出 B1。而 fun2不是虚函数,所以执行 “p- func2();”输出为 A2。 13 【正确答案】 B 【试题解析】 本题由主函数 main 入手,定义 TestClass 型的常对象 a,然后调用对象 a中的成员函数 print()。因为在 C+中,如果一个对象被声
22、明为常对象,则不能调用该对象中的非 const型的成员函数。所以,这里调用的是对象中的eonst型成员函数 “void prmt()eonst”,输出为 print2。 14 【正确 答案】 A 【试题解析】 本题考查混合运算表达式类型,由表达式中具有最高优先级的类型所确定,所以答案为 A。 15 【正确答案】 B 【试题解析】 本题考核函数模板的使用。引用模板函数和引用一般的函数在语法形式上没有任何区别。所有的类型替换都是编译器在幕后悄悄进行的。但是要注意的是说明一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确定是否匹配函数模板中对应的形参。例如,本题中的 B 选
23、项,编译系统从第一个参数 “3.5“获得的信息是 “T对应于 double“,而从第二个参 数“4“处获得的信息是 “T对应于 int“,二者相互矛盾,在编译时会产生错误。对于D选项中紧跟在函数名后的 double就是模板实参表,通过它通知编译系统在调用过程中,将 int型的参数 “4“将换成 double 型。 16 【正确答案】 C 【试题解析】 本题考查的是内联函数的相关知识点。函数原型应指出函数名、返回值类型以及在调用函数时知心朋友提供的参数的个数和类型,因为要声明为内联函数,故应加 inline关键宇。 17 【正确答案】 B 【试题解析】 右移运算符 “ ”是双目运算符。 其功能是
24、把 “ ”左边的运算数的各二进位全部右移若干位, “ ”右边的数指定移动的位数。例如 :设 a15, a 2表示把 000001111右移为 00000011 (十进制 3) 。 18 【正确答案】 A 【试题解析】 C语言中如果基类的成员是保护的,它被继承后在子类中该成员可能是保护的,也可能不是,主要看继承的权限是 public还是 protected 或 private的。 19 【正确答案】 A 【试题解析】 在基类中用 virtual 声明成员函数为虚函数,所以 A是正确的。 纯虚函数是在声明虚函数时被 “初始化 ”为 0的虚函数。纯虚函数是一种特殊的虚函数,它没有具体的实现。静态数据
25、成员函数只能在类外进行初始化。 20 【正确答案】 D 【试题解析】 此题中,语句 C obj对象初始化首先调用基类的构造函数 A(),输出 “A”,其次是 C类中对象的构造函数的调用,即调用 B(),输出 “B”;最后是调用自身的构造函数 C(),输出 “C”。 21 【正确答案】 A 【试题解析】 使用 new 创建对象数组或一般数组时,不能为该数组指定初始值,其初始值为默认值。 22 【正确答案 】 C 【试题解析】 调用格式;类名:成员名或者类名:成员名(参数表 )。 23 【正确答案】 D 24 【正确答案】 B 25 【正确答案】 C 26 【正确答案】 C 【试题解析】 基类中说
26、明的虚函数,在派生类中自然就是虚函数,所以类 B 中funcl()是虚函数;而类 A中的 fanc2没有被关键字 virtual 修饰,所以不是虚函数。 27 【正确答案】 D 【试题解析】 数据封装为了防止不同模块间数据的非法访问及修改。 28 【正确答案】 C 【试题解析】 对于 template class T T add(T x, T y)return x+y; 调用时可以省略模板实参的声明,但是要求 x和 y的数据类型必须是一样的。 29 【正确答案】 A 【试题解析】 本题考核派生类的定义和访问权限。变量 i和 j都是基类 A的私有变量,它们是隐蔽的,在派生类中不能直接访问。 30
27、 【正确答案】 D 【试题解析】 本题考核函数的原型声明格式。解析此题时,要注意函数定义和函数声明的区别。 C+中每一个函数的定义都是由 4个部分组成的,即函数类型、函数名、函数参数表和函数体。 函数的声明是为了消除函数定义的位置影响。不管函数是在何处定义的,只要在调用前进行函数的声明,就可保证函数调用的合法性。 函数原型的说明格式为: 类型函数名 (形参表 ); 31 【正确答案】 C 【试题解析】 C+中,类是用户自定义的一种数据类型,对象是类的实例,类定义了属于该类的所有对象的共同特性。一个类作为一种数据类型,它可以定义多个对象。 32 【正确答案】 B 【试题解析】 派生类对象的数据
28、结构是由基类中说明的数据成员和派生类中说明的数据成员共同构成,所以不能继承基类的构造函数,必须重新定义。 33 【正确答案】 C 【试题解析】 本题考查考生对拷贝构造函数的掌握。因为 +运算是右结合的,所以在使用 a对 b赋值时, b的 num变为 1而 a的 num变为 2(先赋值再自加 )。 34 【正确答案】 A 【试题解析】 本题比较简单,考查自增运算符的运算规则以及运算符优先级的知识点。自增运算符的优先级高于乘法运算符的优先级。 35 【正确答案】 A 【试题解析】 C+派生格式。 36 【正确答案】 数据结构 【试题解析】 结构化分析方法主要包括 :面向数据流的结构化分析方法 (S
29、A-Structured analysis) ,面向数据结构的 Jackson 方法 (JSD-Jackson system development method) 和面向数据结构的结构化数据系统开发方法 (DSSD-Data structured system development method) 。 37 【正确答案】 扇出 【试题解析】 在结构图中,调用一个给定模块的模块个数称为扇入,一个 模块直接调用的其他模块个数称为扇出。 38 【正确答案】 中序 【试题解析】 二叉树的遍历可以分为三种:前序遍历、中序遍历和后序遍历。 前序遍历是指在访问根结点、遍历左子树与遍历右子树这三者中,首先
30、访问根结点,然后遍历左子树,最后遍历右子树;并且遍历左、右子树时,仍然先访问根结点,然后遍历左予树,最后遍历右子树。 中序遍历指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历左子树,然后访问根结点,最后遍历右子树;并且遍历左、右子树时,仍然先遍历左子树,然后访问根结点,最后遍历右 子树。 后序遍历指在访问根结点、遍历左子树与遍历右子树这三者中,首先遍历右子树,然后访问根结点,最后遍历左子树;并且遍历左、右子树时,仍然先遍历右子树,然后访问根结点,最后遍历左子树。 39 【正确答案】 DEBFCA 40 【正确答案】 白盒法 【试题解析】 单元测试又称模块测试,一般采用白盒法测试。 41
31、 【正确答案】 20 【试题解析】 本题考核虚基类。本题中,虽然 Derived1和 Derived2 都是由共同的基类 x派生而来的,但由于引入了虚基类,使得它们分别对应基类 的不同副本。这时数据成员 x只存在一份拷贝,不论在类 Derived1中修改,还是在类Derived2中修改,都是直接对这惟一拷贝进行操作。本题程序执行语句 “Derived obJ;”时,就会先调用虚基类 Base的构造函数,使得 x=0,然后执行类 Derived1的构造函数使得 x=10,再执行类 Derived2 的构造函数,使得 x=20。最后输出 x的值为 20。 42 【正确答案】 Sample(int
32、m):con(m+1)n=m;) 【试题解析】 本题考察常数据成员的初始化方法。常数据成员的定义必须 出现在类体中,而且初始化只能通过构造函数的成员初始化列表进行,而且不能被更新。 43 【正确答案】 构造函数和析构函数 【试题解析】 C+的类的继承中,基类的构造函数和析构函数不能被继承。 44 【正确答案】 friend 【试题解析】 声明友元的方式是在类定义中用关键字 friend 说明该函数或类。 45 【正确答案】 Would you like C? 46 【正确答案】 类 【试题解析】 C+语言中的构造函数就是在类中定义的和类名一样的函数。 47 【正确答案】 operator+(x, y) 【试题解析】 C+中用成员函数重载 x+y为 x.operator +(y); ,用友元函数重载x+y为 operator+(x, y)。 48 【正确答案】 真 【试题解析】 本题考查的是对于逻辑运算符号的理解, “|”运算符的任何一边取值为真,则整个运算结果为真。 49 【正确答案】 C 【试题解析】 本题考察强制类型转化, char()在这里作为一个强制类型转化函数存在,将整数转化为字符。 50 【正确答案】 非数据成员 【试题解析】 在 C+类的规定中,静态函数只能给引用类的静态成员和非数据成员。