二级C++笔试386真题含答案与解析交互.docx
《二级C++笔试386真题含答案与解析交互.docx》由会员分享,可在线阅读,更多相关《二级C++笔试386真题含答案与解析交互.docx(30页珍藏版)》请在冰豆网上搜索。
二级C++笔试386真题含答案与解析交互
二级C++笔试-386
(总分100,做题时间90分钟)
一、选择题
1.
下面程序的运行结果为( )。
#include<iostream.h> voidmain() { chara=‘3’; switch(a) { case’3’:
cout<<“3”; case’2’:
cout<<“2”;break; default:
cout<<“1”; } }
A 3
B 321
C 31
D 32
分值:
2
答案:
D
[解析]本题主要考查的是switch语句的使用,在第一个csse处,因为满足条件所以输出字符3,但这个分支没有break语句终止,所以会继续执行下面的分支语句,即输出字符2,这时出现break语句,结束整个语句,即输出32。
2.
有如下类声明:
classXA{ intX; public:
XA(intn){x=n;} }; classXB:
publicXA{ inty; public:
XB(inta,intb); ); 在构造函数XB的下列定义中,正确的是( )。
A XB:
:
XB(inta,int:
x(,y({}
B XB:
:
XB(inta,int:
XA(,y({}
C XB:
:
XB(inta,int:
x(,XB({}
D XB:
:
XB(inta,int:
XA(,XB({}
分值:
2
答案:
B
[解析]本题考查提派生类中构造函数的定义。
派生类的构造首先要调用基类的构造函数,对基类成员初始化;然后对派生类中的新增成员初始化。
格式:
派生类名(构造函数形参表)基类构造函数(形参表)。
3.
下列叙述正确的是( )。
A 算法的执行效率与数据的存储结构无关
B 算法的空间复杂度是指算法程序中指令(或语句)的条数
C 算法的有穷性是指算法必须能在执行有限个步骤之后终止
D 以上3种描述都不对
分值:
2
答案:
C
[解析]算法的执行效率与数据的存储结构密切相关。
算法的空间复杂度是指算法执行过程中所需的存储空间。
4.
下列程序的输出结果是( )。
#include<iostream> usingnamespacestd; intmain() 于 chara[]=”Hello,Test”; Char*p=a; while(*p) { if(*p)=’a’&&*p(=’z’) cout<<char(*p+’A’-’a’); elsecout<<*p; p++; } return0; }
A hello,test
B Hello,Test
C HELLO,TEST
D hELLO,tEST
分值:
2
答案:
C
[解析]用一个指针变量p指向字符数组a,在while循环中,当不指向数组尾时,将小写字母转换为大写字母!
然后将其输出。
5.
继承机制的作用是( )。
A 信息隐藏
B 数据封装
C 定义新类
D 数据抽象
分值:
2
答案:
C
[解析]数据封装就是数据抽象,即信息隐藏;而继承是实现程序复用的基础。
6.
当需要将一个函数boolisnumber(charc)声明为内联函数时,则此内联函数的函数原型为( )。
A enumboolisnumber(char;
B defineboolisnumber(char;
C inlineboolisnumber(char;
D extemboolisnumber(char;
分值:
2
答案:
C
[解析]本题考查的是内联函数的相关知识点。
函数原型应指出函数名、返回值类型以及在调用函数时知心朋友提供的参数的个数和类型,因为要声明为内联函数,故应加inline关键宇。
7.
已知在一个类体中包含如下函数原型:
VOLUMEOPERATOR-(VOLUME)const;,下列关于这个函数的叙述中,错误的是( )。
A 这是运算符-的重载运算符函数
B 这个函数所重载的运算符是一个一元运算符
C 这是一个成员函数
D 这个函数不改变类的任何数据成员的值
分值:
2
答案:
B
[解析]本题考核运算符的重载。
题中语句为运算符“-”是一个二元运算符,且是作为常成员函数来重载的,所以它不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。
8.
下面程序的运行结果为( )。
#include<iostream.h> voidswap(int&a,intb) { inttemp; temp=a++; a=b; b=temp; } voidmain() { inta=2,b=3; swap(a,b); cout<<a<<“,”<<b<<end1; }
A 2,3
B 3,2
C 2,2
D 3,3
分值:
2
答案:
D
[解析]本题考查的是引用调用,因为函数swap引用调用参数a,所以在swap函数中a的变化会改变主函数中a的值,即a自加1,但b的值并未改变。
9.
下列是软件调试技术的是( )。
A 错误推断
B 集成测试
C 回溯法
D 边界值分析
分值:
2
答案:
C
[解析]软件调试技术包括强行排错法、回溯法和原因排除法。
边界值分析、错误推断都是黑盒测试的方法。
10.
下列程序的运行结果为( )。
#include<iostream.h> template<classTT> classFF {TTa1,a2,a3; public:
FF(TTb1,TTb2,TTb3){a1=b1;a2=b2;a3=b3;} TTSum(){returna1+a2+a3;}}; voidmain() {FF<int>x(int(1.1),2,3),y(int(4.2),5,6); cout<<x.Sum()<<‘‘<<y.Sum()<<endl;}
A 6.115.2
B 615
C 615.2
D 6.115
分值:
2
答案:
B
[解析]本题考查模板函数的应用,表达式int(1.1)和int(4.2)是将1.1和4.2强制转换为整型。
11.
下列关于虚函数与函数重载区别的叙述中不正确的是( )。
A 函数说明形式上不同
B 函数重载允许是非成员函数,虚函数只能是成员函数
C 函数重载的调用依据参数和类型的差别,虚函数则依据对象
D 函数重载的本体可以在类外定义,虚函数不可以
分值:
2
答案:
D
[解析]A项,B项,C项均为虚函数与函数重载的不同之处。
但有一点它们是相同的:
在类内外定义均可。
故D项错误。
12.
下列叙述中正确的是( )。
A 在模块化程序设计中,一个模块应该尽量多的包括与其他模块联系的信息
B 在自顶向下、逐步细化的设计过程中,首先应设计解决问题的第一个细节
C 在模块化程序设计中,一个模块内部的控制结构也要符合结构化原则
D 在程序设计过程中,不能同时采用结构化程序设计方法与模块化程序设计方法
分值:
2
答案:
C
[解析]在模块化程序设计中,模块之间的联系可以通过程序的控制结构来实现,在自顶向下、逐步细化的设计过程中,首先要考虑全局目标,而不是细节。
在程序设计中,模块化和结构化可以同时使用,一个模块的内部结构也要符合结构化设计原则。
13.
两个或两个以上模块之间联系的紧密程度称为( )。
A 耦合性
B 内聚性
C 复杂性
D 数据传输特性
分值:
2
答案:
A
[解析]耦合性是模块间互相连接的紧密徽的度量,取决于各个模块之间接口的复杂度、调用方式以及哪些信息通过接口。
14.
下列关于this指针的叙述中,正确的是( )。
A 任何与类相关的函数都有this指针
B 类的成员函数都有this指针
C 类的友元函数都有this指针
D 类的非静态成员函数才有this指针
分值:
2
答案:
D
[解析]本题考查的是this指针的使用。
类的每一个成员函数都有一个隐含的常量指针,即this指针。
类的静态成员函数不能含有this指针,因为this指针是一个指向本对象的指针。
15.
有如下数组声明:
intnumC[10],下标值引用错误的是( )。
A num[10]
B num[5]
C nam[3)
D num[0]
分值:
2
答案:
A
[解析]数组定义中的数字指的是数组的大小,而下标是从。
开始的,所以数组的最后一个元素是hum[9]。
16.
源程序的文档化不包括( )。
A 符号名的命名要有实际意义
B 正确的文档形式
C 良好的视觉组织
D 正确的程序注释
分值:
2
答案:
B
[解析]源程序的文档化主要包括3点:
(1)符号名应具有一定实际的含义,便于理解程序功能:
(2)正确的程序注释;(3)良好的视觉组织。
利用空格、空行、缩进等技巧使程序层次清晰。
17.
有如下程序:
#include<iostream> usingnamespacestd; ClassTestClass { private:
intx,y; public:
TestClass(inti,intj) { x=i; y=j; } voidprint() { cout<<“print1”<<endl; } voidprint()const { cout<<”print2”(<endl; } ); Intmain() { constTestClassa(1,2); a.print(); return0; } 该程序运行后的输出结果是( )。
A printl
B print2
C printlprint2
D 程序编译时出错。
分值:
2
答案:
B
[解析]本题定义TestClass型的常对象a,然后调用对象a中的成员函数print()。
因为在C++中,如果一个对象被声明为常对象,则不能调用镇对象中的非const型的成员函数。
所以,这里调用的是对象中的const型成员函数“voidprint()const”,输出为print2。
18.
下列叙述中错误的是( )。
A 一种数据的逻辑结构可以有多种存储结构
B 数据的存储结构与数据的处理效率无关
C 数据的存储结构与数据的处理效率密切相关
D 数据的存储结构在计算机中所占的空间不一定是连续的
分值:
2
答案:
B
[解析]数据的存储结构分为顺序结构和链式结构,一个数据的逻辑结构可以有多种存储结构。
顺序结构中数据元素所占的存储空间是连续的,而链式存储结构中,数据元素所占的存储空间不一定是连续的。
数据的存储结构与数据的处理效率密切相关。
19.
下列工具中为需求分析常用工具的是( )。
A PAD
B PFD
C N-S
D DFD
分值:
2
答案:
D
[解析]需求分析常用的工具有数据洗图(DFD)、数据字典(DD)、判定树和判定表。
PAD(问题分析图)、PFE(程序流程用)、N-S(盒式图)都是详细设计的常用工具,不是需求分析的工具。
20.
设计数据库的存储结构属于( )。
A 需求分析
B 概念设计
C 逻辑设计
D 物理设计
分值:
2
答案:
D
[解析]物理设计阶段主要解决选择文件存储结构和确定文件存取方法的问题,包括:
选择存储结构、确定存取方法、选择存取路径、确定数据的存放位置。
21.
对于拷贝构造函数和赋值操作的关系,正确的是( )。
A 拷贝构造函数和赋值操作是完全一样的操作
B 进行赋值操作时,会调用类的构造函数
C 当调用拷贝构造函数时,类的对象正在被建立并被初始化
D 拷贝构造函数和赋值操作不能在同一个类中被同时定义
分值:
2
答案:
C
[解析]在赋值操作中,将发生对象的拷贝操作,但并不说明两者是完全一样的。
一般情况下,如果给类定义了赋值操作符,则应该同时定义合适的拷贝构造函数,除非系统默认生成的拷贝构造函数满足赋值操作。
实际上,系统默认的拷贝构造函数仅仅将数据成员进行简单的对应赋值,而在多数特殊应用中,需要程序员重新定义拷贝构造函数。
22.
下面关于C++流的叙述中,正确的是( )。
A cin是一个输入流对象
B 可以用ifstream定义一个输出流对象
C 执行语句序列char*y=“PQMN”;cout<<y;将输出字符串”PQMN”的地址
D 执行语句序列char x[80];cigetline(x,80);时。
若键入“Happynewyear”,则,中的字符串是“Happy”
分值:
2
答案:
A
[解析]本题考查C++洗的概念和I/()的格式化。
cln是lstream类的对象,即输入流对象。
ifstream是输入文件流类不能定义个输出流对象。
getline函数功能是允许从输入流中读取多个字符,并且允许指定输入终止,在读取完成后,从读取的内容中删除读终止字符,所以D选项中的语句序列后x中字符串应该是”Happynewyear”。
23.
控制格式输入/输出的操作中,设置域宽的函数是( )。
A WS
B oct
C setfilt(in
D setw(in
分值:
2
答案:
D
[解析]本题需要考生记忆一些输入输出控制操作子,oct为八进制,setfill为设置填充符,setw为设置域宽。
24.
下列虚基类的声明中正确的是( )。
A classvirtualB:
publicA
B virtualclassB:
publicA
C classB:
publicAvirtual
D classB:
virtualpublicA
分值:
2
答案:
D
[解析]虚基类说明格式为:
virtual<继承方式><基类名>其中,virtual是虚基类的关键词。
虚基类的说明是用在定义派生类时,写在派生类名的后面。
即:
class<派生类名>Virtual<继承方式><基类名>;
25.
有如下函数模板声明:
template<typenameT> TMax(Ta,Tb){return(a>=b)?
a:
b;} 下列对函数模板Max()的调用中错误的是( )。
A Max(3.5,4.5)
B Max(3.5,4)
C Max(doubl(3.5,4.5)
D Max<double>(3.5,4)
分值:
2
答案:
B
[解析]引用模板函数和引用一般的函数在语法形式上没有任何区别。
说明一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对应的形参。
26.
有如下程序:
#include<iostream> usingnamespacestd; ClassTest { public:
Test() {n+=2;} ~Test() {n-=3;} staticintgetNum() {returnn;} private:
staticintn; }; intTest:
:
n=1; intmain() { Test*p=newTest; deletep; cout<<“n=”<<Tes:
:
getNum()<<endl; return0; } 执行后的输出结果是( )。
A n=0
B n=1
C n=2
D n=3
分值:
2
答案:
A
[解析]静态数据成员是类中所有对象共享的成员,而不是某个对象的成员。
题中变量n是静态数据成员,对象对其操作的结果具有叠加作用,main函数中先定义了Test的对象*p,然后又deletep,所以对静态数据n进行了两次操作,分别是”n+=2”和”n+=3”,n的初始值是1,那么n最后的值变为0。
main函数最后通过调用静态函数getNum得到n的值,并输出。
27.
类MyClass的定义如下:
classMyClass { public:
MyClass(){value=0;} SetVariable(inti){value=i;} private:
intvalue; }; 则对下列语句序列正确的描述是( )。
A 语句p=&my,是把对象:
my赋值给指针变量p
B 语句MyClass*p,my;会调用两次类MyClass的构造函数
C 对语句*SetVariable(5)的调用是正确的
D 语句P->SetVariable(5)与语句mSetVariable(5)等价
分值:
2
答案:
D
[解析]选项A,语句p=&my;是把对象my的地址值赋值给指针变量P;选项B,语句MyClass*p,my;由于p只是一个指向对象的指针,因此定义指针p不调用构造函数,所以此语句只调用一次构造函数:
对成员函数的引用可以通过两种形式:
指针->成员函数(形参表)或者对象名。
成语函数名(形参表),故选项C错误,选项D正确。
28.
下面程序的运行结果是( )。
#include<iostream.h> classbase{ protected:
inta; public:
base(){cout<<“0”;} }; Classbase1:
virtua1base{ public:
base1(){cout<<“1”;} }; classbase2:
virtualbase{ public:
base2(){cout<<“2”;} }; Classderived:
publicbase1,publicbase2{ public:
derived(){cout<<“3”;} }; voidmain() { derivedobj; cout<<endl; }
A 0123
B 3120
C 0312
D 3012
分值:
2
答案:
A
[解析]本题考查的是含有虚基类的继承中构造函数的调用顺序,应该先调用基类的构造函数,接着是按照派生类继承列表的顺序依次调用虚基类的构造函数,最后调用派生类自己的构造函数。
29.
下列关于运行符重载的描述中,正确的是( )。
A 运算符重载可以改变操作数的个数
B 运算符重载可以改变操作数的优先级
C 运算符重载可以改变运算符的结合性
D 运算符重载可以使运算符实现特殊功能
分值:
2
答案:
D
[解析]C++把重载的运算符视为特殊的函数,称为运算符函数,函数名就是在运算符前加上保留字opera-tor。
C++中通过重新定义运算符,使它能够用于特定类的对象执行特定的功能。
但是用户重新定义运算特,不改变原运算符的操作符个数、优先级和结合性。
同时运算符重载后,也不改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。
30.
以下程序的输出结果是( )。
min() { inti=0,a=0; while(i<20) { for(;;) { if((i%10)==0)break; elsei--; } i+=11;a+=i; } cout<<a<<endl; }
A 21
B 32
C 33
D 11
分值:
2
答案:
B
[解析]本题是两个循环语句和一个判断语句的嵌套。
For循环的作用是在i等于10的时候跳出循环本题的答粟为B。
31.
下面说法正确的是( )。
A 内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方
B 内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方
C 类的内联函数必须在类体内定义
D 类的内联函数必须在类体外通过加关键字inline定义
分值:
2
答案:
B
[解析]内联函数用inline修饰,用于取代C语官中的宏定义。
inline是个建议机制而不是强制机制,也就是说,程序员可以指定任意函数为inline函数,但是编译器会根据系统情况来决定是否将其inline处理。
对于较大的函数,编译器往往会取消其inline特性。
inline函数的特点之一就是执行速度快,他实质是在编译时将函数的目标代码插入到每个调用该函数的地方,从而没有出栈入栈、保护现场等开销,提高了效率。
在类体内定义的成员函数,自动被编译器当做内联函数处理,在类体外定义的成员函数,如果用inline修饰,编译器也认为是一种内联建议。
32.
下列程序的执行结果是( )。
#include<iostream.h> classSample { intx,y; public:
Sample(){x=y=0;) Sample(inta,intb){x=a;y=b;} ~Sample() { if=(x==y) cout<<“x=y”<<endl; else cout<<“x!
=y”<<endl; } voiddisp() { cout<<“x=”<<x<<“,y=”<<y<<endl; } }; voidmain() { Samples1(2,3); s1.disp(); }
A x=2,y=2
B x=3,y=3
C x=2,y=3
D x=3,y=2
分值:
2
答案:
C
[解析]本题考查的是类的构造函数和析构函数。
首先,Samplesl(2,3);会调用含有两个参数的构造函数Sample(inta,intb){x=a,y=b,),disp()函数输出成员变量x和y的值:
x=2,y=3;然后结束时调用析构函数,因为x和y值不等,故输出x!
=y。
33.
有如下类声明:
classXA{ intX;