国家二级(C++)笔试模拟试卷230 (题后含答案及解析)
题型有:1. 选择题 2. 填空题
选择题(每小题2分,共70分)下列各题A、B、C、D四个选项中,只有一个选项是正确的,请将正确选项涂写在答题卡相应位置上。
1. 下列叙述中正确的是
A.实体集之间一对一的联系实际上就是一一对应的关系 B.关系模型只能处理实体集之间一对一的联系 C.关系模型属于格式化模型 D.以上三种说法都不对
正确答案:D
解析:实体集之间一对一的联系不一定是一一对应的关系。例如,在一个教室中,实体集“学生”与实体集“座位”之间是一对一的联系。因为实体集“学生”中的每一个学生最多与实体集“座位”中的一个座位有联系(学生坐在该座位上);并且,实体集“座位”中的每一个座位也最多与实体集“学生”中的一个学生有联系(座位上坐着该学生)。但该教室中的学生与座位之间不一定是一一对应的关系,因为有可能某些座位是空的,没有学生去坐。因此,选项A中的说法是错误的。在关系模型中,由于使用表格数据来表示实体之间的联系,因此,可以直接描述多对多的实体联系。因此,选项B中的说法也是错误的。关系模型是与格式化模型完全不同的数据模型,它与层次模型、网状模型相比有着本质的区别。关系模型是用表格数据来表示实体本身及其相互之间的联系,它是建立在数学理论基础上的。因此,选项C中的说法也是错误的。
2. 下列关于虚函数的描述中,正确的是A) 虚函数是一个static类型的成员函数B) 虚函数是一个非成员函数C) 基类中采用virtual说明一个虚函数后,派生类中定义相同类型的函数时可不必加virtualD) 派生类中的虚函数与基类中相同原型的虚函数具有不同的参数个数或类型
A. B. C. D.
正确答案:C
解析:虚函数是在类的声明中使用virtual关键字来限定的成员函数,在成员函数实现时不能再使用virtual关键字进行限定。派生类中的虚函数必须和基类中的虚函数的形参个数、形参类型、返回值完全一致。虚函数不能用static关
键字进行修饰。
3. A. B. C. D.
正确答案:B 解析:数据的逻辑结构是数据间关系的描述,它仅抽象地反映数据间的逻辑关系,并不管其在计算机中的存储方式。数据的逻辑结构分为线性结构和非线性结构。若各数据元素之间的逻辑关系可以用一个线性序列简单地表示出来则称之为线性结构,否则称为非线性结构。线性表是典型的线性结构,而树形结构是典型的非线性结构。
4. 下列叙述中正确的是
A.数据库系统是一个的系统,不需要操作系统的支持 B.数据库技术的根本目的是解决数据的共享问题 C.数据库管理系统就是数据库系统 D.以上3种说法都不对
正确答案:B 解析:数据库技术的根本目的是要解决数据的共享问题;数据库需要操作系统的支持;数据库管理系统(Database Management System,DBMS),对数据库进行统一地管理和控制,以保证数据库的安全性和完整性。它是数据库系统的核心软件。
5. 下列程序的输出结果为2,横线处应添加语句( )。 #include<iostream> using namespace std; { public: ______void fun( ){cout<<1;} }; class TestClass2:public TestClass1 { public:void fun( ){cout<<2;) }; int main( ) { TestClass1 *p=new TestClass2; p->fun( ); delete p; Teturn 0; }
A.public
B.private C.virtual D.protected
正确答案:C
解析:由主函数main入手,定义TestClass1类的指针对象p指向派生类Testclass2。因为基类和派生类中都有fun函数,题目要求输出为2,就是基类对
象访问派生类中fun函数。通过虚函数与指向基类对象的指针变量的配合使用,就能方便调用同名函数。所以这里将基类中的fun函数声明为virtual。并且当一个成员函数被声明为虚函数后,其派生类中的同名函数自动成为虚函数。
6. 下列关于类和对象的叙述中,错误的是( )。 A.一个类只能有一个对象 B.对象是类的具体实例 C.类是对某一类对象的抽象
D.类和对象的关系是一种数据类型与变量的关系
正确答案:A 解析:此题考查的是类和对象的相关概念。类是将不同的数据和与这些数据相关的操作封装起来装在一起的集合体。对象是类的具体实例,也即类是对某一类对象的抽象,类和对象之间可以说是数据类型与变量的关系。一个类可以有无数个对象。
7. A. B. C. D.
正确答案:C
解析:此题考查的是内联函数的概念。在调用时,内联函数会像宏函数一样的展开,将调用表达式用内联函数体来替换,所以它没有一般函数的参数压栈和退栈操作,所以选项A)错误;即使没有使用inline说明,编译器也会将在类的说明部分定义的函数认定为内联函数,所以选项B)错误;内联函数只是比普通函数有更高的执行效率。
8. 软件工程的出现是由于( )。 A.程序设计方法学的影响 B.软件产业化的需要 C.软件危机的出现 D.计算机的发展
正确答案:C
解析:软件工程的出现源自于软件危机。为了消除软件危机,通过认真研究解决软件危机的方法,认识到软件工程是使计算机软件走向工程科学的途径,逐步形成了软件工程的概念。
9. 在一个单链表HL中,若要向表头插入一个由指针p指向的节点,则需
要执行语句序列( )。
A.HL=p;p->next=HL; B.p->next=HL;HL=p; C.p->next=HL;p=HL;
D.p->next=HL->next;HL->next=p
正确答案:B
解析:HL为链表的头指针。HL指示链表中第一个节点的存储位置,在表头插入一个由指针p指向的节点后,头指针指向p,p的指针域指向原链表中第一个节点
10. 若要把函数void f( )定义为aClass的友元函数,则应该类aClass的定义中加入的语句是( )。
A.void f( );
B.static void f( ); C.friend f( );
D.friend void f( );
正确答案:D
11. 下列运算符中,不能重载的是 A.?: B.+ C.- D.<=
正确答案:A
解析:在C++中,?:是唯一个三目运算符,不能被重载。
12. 设int a=1,b=2;,则(a++) +b和a+++b这两个表达式的值分别为
A.3,3 B.3,4 C.4,3 D.4,4
正确答案:A
解析:单目的什运算优先级高于双目的 +运算,不过抖的结合性是自右向左的,而+是自左向右的,所以上面的两个表达式都是先计算a+b的值之后,a再自加1。
13. 下面叙述错误的是( )。 A.派生类可以使用private派生
B.对基类成员的访问必须是无二义性的 C.基类成员的访问能力在派生类中维持不变 D.赋值兼容规则也适用于多继承的组合
正确答案:C 解析:在建立派生类的时候,并不是简单地把基类的私有成员直接作为派生类的私有成员,把基类的公用成员直接作为派生类的公用成员。涉及如何确定基类的成员在派生类中的访问属性问题,不仅要考虑对基类成员所声明的访问属性,还要考虑派生类所声明的对基类的继承方式,根据这两个因素共同决定基类成员在派生类中的访问属性。所以本题选择C。
14. 下面关于this指针的说法中错误的是( )。
A.this指针是一种隐含指针,存在于每个类的非静态成员函数中 B.它是成员函数所属对象的指针
C.通过this成员变量的形式可以访问类中的数据成员
D.成员函数访问类中的数据成员格式可写成:this->成员变量
正确答案:C
解析:this指针是一个隐含指针,它隐含于每个类的非静态成员函数中。this指针是成员函数所属的对象指针,它指向当前类的对象地址。通过this指针访问当前对象成员有两种方式:(*this).成员,this->成员。
15. 虚函数( )是可以不同的。 A.函数名 B.参数个数 C.返回类型 D.函数体内容
正确答案:D
解析:在C++中的虚函数是一种单界面多实现版本的实现方法,即函数名、返回类型、函数类型和个数顺序完全相同,但函数体内容可以完全不同。
16. 关于下面程序的说法,正确的是( )。 #include <iostream> using namespace std; class x { int a; public: x( ){a=3;} int geta( ) {cout<<a<<endl; return a; } }; class y: x { int b; public: x:: geta; //A void result ( )
{b=geta ( )+8; cont<<b<<endl;} }; void main ( ) { y yy; //B yy. result( ); yy. geta( );//C }
A.A行错误,应写成“x::geat( )” B.B行错误,应写成“y yy( );” C.C行错误,不能对私变量引用
D.没有错误,其输出结果为: 3 11 3
正确答案:D
解析:语句x::geta;把基类中的公有成员说明为子类中的公有成员,因而可以为子类对象引用。
17. 必须用一对大括号括起来的程序段是( )。 A.switch 语句中的case标号语句 B.if语句的分支
C.循环语句的循环体 D.函数的函数体
正确答案:D
18. 下列关于派生类的构造函数的说法中,哪个是错误的 ______。 A.派生类不继承基类的构造函数和赋值运算 B.派生类的构造函数可以调用基类的构造函数 C.派生类的构造函数先于基类的构造函数执行
D.在建立派生类的实例对象时,必须调用基类的构造函数来初始化派生类对象中的基类成员
正确答案:C
19. 设有如下程序段: char str[]=”World”; char*ptr=str; 执行上面的程序段后,*(ptr+5)的值为 ______。
A.‘o’ B.‘0’
C.不确定的值 D.‘o’的地址
正确答案:B
20. 下列函数的运行结果是 #include<iostream.h> int f(int a,int
b) { int c; if(a>b)c=1; else if(a==b)C=0; else c=-1; return(c);} void main( ) { int i=2,j=3; int p=f(i,j); cout<<p;}
A.-1 B.1 C.2
D.编译出错,无法运行
正确答案:A
解析:本题的函数是根据a和b的值来给c赋值。
21. 下面程序的运行结果为 #include<iostream.h> class A { static int n; public:A( ){n=1;}A(intnum){n=num;}void print( ){cout <<n;} }; int A∷n=2; void main( ) { Aa,b(3);
a.print( ); b.print( ); cout <<end1; }
A.11 B.13 C.23 D.33
正确答案:D
解析:本题考查的是静态数据成员的使用,n为类A的静态成员,即为类A的所有对象共有的成员,所以,当对象b把n初始化为3时,对象a的成员n的值也为3(这两个n实际上是同一个)。
22. 有以下函数: char fun(char*p) {return p;) 则该函数的返回值是( )。
A.无确切的值
B.形参p中存放的地址值 C.一个临时存储单元的地址 D.形参p自身的地址值
正确答案:B
23. 已有如下定义和输入语句,若要求a、b、c、d分别得到的值为10、20、’A’和’B’,当从第一列开始输入数据时,正确的数据输入方式是( )。 int a,b char c,d; cin>>a>>b>>c>>d;
A.10,20<空格>A,B<回车>
B.10<空格>20<空格>A<空格>B<回车> C.10<空格>20,A,B<回车> D.10,20,A,B<回车>
正确答案:B
24. 如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是( )
A.一元运算符 B.二元运算符
C.选项A和选项B都可能 D.重载错误
正确答案:D
25. 下列关于虚基类的描述,错误的是( )。 A.设置虚基类的目的是为了消除二义性 B.虚基类的构造函数在非虚基类之后调用
C.若同一层中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用
D.若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数
正确答案:B
26. 下面不属于C++语言的基本数据类型的是( )。 A.字符类型 B.整数类型 C.逻辑类型 D.枚举类型
正确答案:B
解析:本题考核C++数据类型范围。C++中unsigned char类型的数据其取值范围为0~127,所以题中value加1后,其值将变为0。因此程序的最后输出为100,即 B选项。
27. 在进行任何C++流的操作后,都可以用C++流的有关成员函数检测流的状态。其中只能用于检测输入流状态的操作函数名称是( )。
A.fail B.eof C.bad D.good
正确答案:B
解析:C++中可以用文件流对象的下列成员函数来判别文件流的当前状态。 ①函数is_open( ):判定流对象是否与一个打开的文件相联系,若是,返回true,否则返回false。 ②函数good( ):刚进行的操作成功时返回true,否则返回false。 ③函数fail( ):与good( )相反,刚进行的操作失败时返回true,否则返回false。 ④函数bad( ):如果进行了非法操作返回true,否则返回false。 ⑤函数eof( ):进行输入操作时,若到达文件尾返回true,否则返回false。 其中,eof函数只能用于输入流操作。
28. 如果x=0,那么while(true)中的true与下面的条件( )等价。 A.X=1 B.X==1 C.X>1 D.X<1
正确答案:A
29. 以下程序的结果是( )。 #include<iostream.h> void main( ) {char * p=“abcdefgh”,*r; long *q; q=(long*)P; q++; r=(char*)q; cout<<r<<endl;
A.defg
B.cdef C.ghab D.efgh
正确答案:D
30. 以下类定义中可能会引起错误的语句是 class A { public: ~A( ){ } //1 int i; //2 private: int j; //3 A(int i) {i++;} //4 };
A.1 B.2 C.3 D.4
正确答案:D
解析:在c++语言中类定义中的构造函数是私有的,但是其却调用了其中的公有变量,在实例化时会出现错误。注意:C++语言类的定义
31. 面向对象程序设计思想的主要特征中不包括 A.继承性
B.功能分解,逐步求精 C.封装性和信息隐藏 D.多态性
正确答案:B 解析:面向对象程序设计的主要特征是继承性,封装性和信息隐藏,多态性。
32. 以下对C++语言函数的有关描述中,正确的是
A.在C++语言中调用函数时,只能把实参的值传给形参,形参的值不能传送给实参
B.C++语言函数既可以嵌套定义又可以递归调用 C.函数必须无返回值,否则不能使用函数 D.函数必须有返回值,返回值类型不定
正确答案:A
解析:形参的值的改变,不能影响实参的值。选项B函数只能嵌套调用,不能嵌套定义;函数要是有返回值其类型必须确定;函数也可无返回值,用 void表示。
33. 与数学式子对应的c++语言表达式是 A.3*x^n/(2*x-1) B.3*x**n/(2*x-1)
C.3*pow(x,n)*(1/(2*x-1)) D.3*pow(n,x)/(2*x-1)
正确答案:C
解析:本题考查考生将数学表达式翻译成C++语句的能力。 34. 对于下列语句,正确的判断是 for(x=0,y=O;(y! =123)&&(x<4);x++);
A.是无限循环 B.循环次数不定 C.最多执行4次 D.最多执行3次
正确答案:C 解析:本题考查for循环条件中三个表达式的执行顺序。首先执行表达式一,然后执行表达式二,如果表达式二为真,则循环体执行,然后执行表达式三,接着继续执行表达式二,如此循环。考生要注意的是,本题中表达式三中包含了变量x的增量操作,因此可以由表达式二和三一起控制循环体的执行次数。本题正确答案为C。
35. 一个类可以同时继承多个类,称为多继承。下列关于多个继承和虚基类的表述中,错误的是
A.每个派生类的构造函数都要为虚基类构造函数提供实参 B.多继承时有可能出现对基类成员访问的二义性问题 C.使用虚基类可以解决二义性问题并实现运行时的多态性 D.建立最派生类对象时,虚基类的构造函数会首先被调用
正确答案:C
解析:本题考核虚基类。C++中,通过虚拟基类所派生的类,在所产生的对象中,只包含了一个和其他类共享的基础对象,也就是说,从同一个基类中以虚拟方式派生的所有类,在它们所产生的对象里,不会有一份基础对象,而只是在内存里保留一份基础对象,而派生类中只保留指向此基础对象的指针,这样就不会同时有两份基类对象的情形发生。用虚基类可以解决二义性问题。但是实现运行时的多态性是虚函数。
填空题(每空2分,共30分)请将每一个空的正确答案写在答题卡上。注意:以命令关键字填空的必须拼写完整。
36. 在链表的运算过程中,能够使空表与非空表的运算统一的结构是______。
正确答案:相关文档。
解析: 计算机软件是计算机系统中与硬件相互依存的另一部分,是包括程序、数据及相关文档的完整集合。
37. 在数据的存储结构中,不仅需要存储各数据元素的信息,还要存放各元素之间______________的信息。
正确答案:前后件关系
解析:在数据存储结构中,除了要存储数据,还要存储数据的前后件关系,对于顺序存储的数据结构,前后件之间的关系是通过存储空间的位置来实现的,而对于链式存储来说,数据元素之间的前后件关系是通过指针来实现的。
38.
正确答案:一对多 解析:实体之间的对应关系称为联系,它反映现实世界事物之问的相互关联。两个实体间的联系可以归结为三种类型:一对一联系表现为某一实体与另一实体一一对应相关联;一对多联系表现为某一实体与相关多个实体相关联;多对多联系表现为多个实体与相关多个实体相联系。所以实体“班主任”与实体“班级”之间存在一对多联系。
39. 在面向对象方法中,类的实例称为______。
正确答案:对象
解析:在面向对象概念中,所有的同类的实体的抽象就构成一个类,而类被实例化就形成一个对象。
40. 在程序设计阶段应该采取______和逐步求精的方法,把一个模块的功能逐步分解,细化为一系列具体的步骤,继而用某种程序设计语言写成程序。
正确答案:自顶向下
解析:程序设计时,应先考虑总体,后考虑细节,逐步使问题具体化,对复杂的问题,应该设计一些子目标作为过渡。上述方法概括为:自顶向下,逐步求精。
41. 请按下面注释的提示,将类B的构造函数定义补充完整。 classA {int a; public: A{int aa=0) (a=aa;} } class B:public A } int b;A c; public://用aa初始化基类A,用aa+1初始化类对象成员cB(int aa): {b=aa+2}};
正确答案:A(aa),c(aa+1) 或 c(aa+1),A(aa)
解析:本题考核派生类构造函数的定义。题中要求用aa初始化基类A,用aa+1初始化类对象成员c,用的初始化列表的形式,即A(aa),c(aa+1)或 c(aa+1),A(aa)。
42. 函数f( )的功能是将形参x的值转换为二进制数,所得二进制数的每一位数放在一维数组y中返回。二进制的最低位放在下标为0的元素中,请将
程序补充完整。 void f(int x,int y[]){ int m=0,n; do{ n=x% 【 】; y[m++] =n; x/=2; }while(x); }
正确答案:2
解析:函数f( )的功能是将形参x的值转换为二进制数,所以程序的空白处应填入2。
43. 若有以下程序:#include <iostream>using namespace std;class Base{public: void who( ){ cout<<”Base”<<end1;}};class Derivedl: public Base{public: void who( ) { cout<<”Derived”<<end1; }};int main( ){ Base *p; Derived1 obj1; p=&obj1; p->who( ); return 0;}则该程序运行后的输出结果是【 】。
正确答案:Derived 44. 若有: int a=10,b=9,c; 则在计算表达式c=(a%11)+(b=3),c+=2后,变量c的值为【 】。
正确答案:15 45. 程序段的输出结果是【 】。 int x=3,y=2,z=1; count<<(x/y&~z);
正确答案:0
46. 为解决在多重继承环境中因公共基类带来的【 】问题,c++语言提供了虚基类机制。
正确答案:二义性
解析:C++中产生虚基类的作用就是为了解决继承中的二义性问题,通过虚基类继承可以把父基类中相同的函数只编译一次。
47. 一个C++语言程序的开发步骤通常包括编辑、【 】、链接、运行和调试。
正确答案:编译
解析:C++语言程序开发的基本步骤是编辑、编译、链接、运行和调试。
48. 求1~100的和,可写成for(s=0,i=1;【 】;i++) s+=i;的形式。
正确答案:i<=100或者i<101
解析:本题考核循环语句。在上述题中,我们看到s=s+i,又有i++,它的含义是当i满足条件时,i自加1,然后再与前面的s相加,值赋给s。所以for语句中,缺少上限表达式。因为是求1-100的和,所以i满足的条件为i<=100或
者i<101。
49. 重载的关系运算符和逻辑运算符的返回类型应当是______。
正确答案:bool
解析:关系运算符和逻辑运算符重载后只能是true或者false,即返回值为bool型。
50. C++在重载运算符中,如用成员函数重载一元运算符参数表中需要【 】个参数,如用友元函数重载一元运算符参数表中需要【 】个参数。
正确答案:01
解析:C++中友元函数重载一元运算符要有一个参数,重载二元运算符要有两个参数,而用成员函数重载时,重载一元运算符没有参数,重载二元运算符要有一个参数。
因篇幅问题不能全部显示,请点此查看更多更全内容