全国计算机二级C++笔试试题解析.docx
《全国计算机二级C++笔试试题解析.docx》由会员分享,可在线阅读,更多相关《全国计算机二级C++笔试试题解析.docx(18页珍藏版)》请在冰豆网上搜索。
全国计算机二级C++笔试试题解析
2010年9月全国计算机二级
C++笔试试题解析
一、选择题(每小题2分,共70分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的。
请将正确选项填涂在答题卡相应位置上,答在试卷上不得分。
(1)下列叙述中正确的是
A)线性表的链式存储结构与顺序存储结构所需要的存储空间是相同的
B)线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构
C)线性表的链式存储结构所需要的存储空间一般要少于顺序存储结构
D)上述三种说法都不对
答案:
D
解析:
线性表的链式储存肯定要比顺序储存占据更多的空间
(2)下列叙述中正确的是
A)在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化
B)在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化
C)在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化
D)上述三种说法都不对
答案:
D
解析:
C应该是:
栈顶指针随栈中元素的变化而变化
(3)软件测试的目的是
A)评估软件可靠性
B)发现并改正程序中的错误
C)改正程序中的错误
D)发现程序中的错误
(4)下面描述中,不属于软件危机表现的是
A)软件过程不规范
B)软件开发生产率低
C)软件质量难以控制
D)软件成本不断提高
(5)软件生命周期是指
A)软件产品从提出、实现、使用维护到停止使用退役的过程
B)软件从需求分析、设计、实现到测试完成的过程
C)软件的开发过程
D)软件的运行维护过程
(6)面向对象方法中,继承是指
A)一组对象所具有的相似性质
B)一个对象具有另一个对象的性质
C)各对象之间的共同性质
D)类之间共享属性和操作的机制
(7)层次型、网状型和关系型数据库划分原则是
A)记录长度
B)文件的大小
C)联系的复杂程度
D)数据之间的联系方式
(8)一个工作人员可以使用多台计算机,而一台计算机可被多个人使用,则实体工作人员、与实体计算机之间的联系是
A)一对一
B)一对多
C)多对多
D)多对一
(9)数据库设计中反映用户对数据要求的模式是
A)内模式
B)概念模式
C)外模式
D)设计模式
(10)有三个关系R、S和T如下:
则由关系R和S得到关系T的操作是
A)自然连接
B)交
C)投影
D)并
(11)下列关于函数参数的叙述中,正确的是
A)在函数原型中不必声明形参类型
B)函数的实参和形参共享内存空间
C)函数形参的生存期与整个程序的运行期相向
D)函数的形参在函数被调用时获得初始值
答案:
D
解析:
A——不必声明的是形参,而不是其类型
B——形参内存空间在栈上,实参则不一定
C——仅仅在函数执行期内
(12)下列关于对象初始化的叙述中,正确的是
A)定义对象的时候不能对对象进行初始化
B)定义对象之后可以显式地调用构造函数进行初始化
C)定义对象时将自动调用构造函数进行初始化
D)在一个类中必须显式地定义构造函数实现初始化
答案:
C
解析:
A——可以而且必须对对象进行初始化,这就是为什么你自己不写构造函数系统都要‘硬’给你整个默认的原因。
B——定义之后就不能再初始化了。
classA
{
};
int_tmain(intargc,_TCHAR*argv[])
{
Aa;
a.A();
return1;
}
如上例,编译器提示:
errorC2274:
“函数样式转换”:
位于“.”运算符右边时非法
D——可以使用默认的构造函数。
(13)下列关于基类和派生类关系的叙述中,正确的是
A)每个类最多只能有一个直接基类
B)派生类中的成员可以访问基类中的任何成员
C)基类的构造函数必须在派生类的构造函数体中调用
D)派生类除了继承基类的成员,还可以定义新的成员
答案:
D
解析:
A——可以有多个。
B——至少私有的是无论如何都访问不到的。
C——恩街自动调用。
(14)下列关于赋值运算符“=”重载的叙述中,正确的是
A)赋值运算符只能作为类的成员函数重载
B)默认的赋值运算符实现了“深层复制”功能
C)重载的赋值运算符函数有两个本类对象作为形参
D)如果己经定义了复制(拷贝)构造函数,就不能重载赋值运算符
答案:
A
解析:
C——1个形参。
D——谁说不能?
能的。
(15)下列关于模板的叙述中,正确的是
A)如果一个类中存在纯虚函数,这个类就是类模板
B)函数模板不能有形式参数表
C)类模板是一种参数化类型的类,是类的生成器
D)类模板中不能包含构造函数
答案:
C
解析:
A——那是抽象类,不是模板。
B——我靠,形参都没有了么还搞啥模板啊,应该是模板参数表不能为空。
D——呃……这个确实能。
(16)下列关于C++预定义流对象的叙述中,正确的是
A)cin是C++预定义的标准输入流对象
B)cin是C++预定义的标准输入流类
C)cout是C++预定义的标准输入流对象
D)cout是C++预定义的标准输入流类
答案:
A
解析:
首先,cin,cout肯定是对象。
(17)下列选项中,正确的C++标识符是
A)6_group
B)group~6
C)age+3
D)_group_6
答案:
D
解析:
不解释
(18)下列选项中,正确的C++表达式是
A)counter++3B)element3+C)a+=bD)’a’=b
答案:
C
解析:
不解释
(19)下列循环语句中有语法错误的是
A)inti;for(i=1;i<10;i++)cout<<‘*‘;
B)inti,j;for(i=1,j=0;i<10;i++,j++)cout<<‘*‘;
C)inti=0;for(;i<10;i++)cout<<‘*‘;
D)for
(1)cout<<‘*‘;
答案:
D
解析:
死循环是这样的:
for(;1;)
(20)下列定义语句中,错误的是
A)intpx*;
B)char*acp[10];
C)char(*pac)[10];
D)int(*p)();
答案:
A
解析:
不解释
(21)下列函数原型声明中,错误的是
A)intfnction(intm,intn);
B)intfunction(int,int);
C)intfunction(intm=3,intn);
D)intfunction(int&m,int&n);
答案:
C
解析:
不解释
(22)若MyClass为一个类,执行“MyClassa[4],*p[5];”语句时会自动调用该类构造函数的次数是
A)2B)5C)4D)9
答案:
C
解析:
不解释
(23)若在表达式y/x中,“/”是作为成员函数重载的运算符,则该表达式还可以表示为
A)x.Operator/(Y)
B)operator/(x,Y)
C)Y.operator/(x)
D)operator/(y,x)
答案:
C
解析:
不解释
(24)若要重载+、=、<<、=和[]运算符,则必须作为类成员重载的运算符是
A)+和=
B)=和<<
C)==和<<
D)=和[]
答案:
D
解析:
至少‘+’,‘<<’可以这么重载:
classA
{
public:
friendAoperator+(A&,A&);
friendAoperator<<(A&,int);
};
借用马克思的一句话:
C++认为‘=’和‘[]’运算符必须是非静态的。
(25)有函数模板声明和一些变量定义如下:
templateT1sum(T2,T3);
doubledl,d2;
则下列调用中,错误的是
A)sum(dl,d2);
B)sum(d1,d2);
C)sum(d1,d2);
D)sum(d1,d2);
答案:
D
解析:
我也是第一次看到这种推演的办法,不过这道题似乎并不是考推演,因为D答案太明显了。
扩展:
本题提示了模板函数在实例化运行过程中,通过实参来对模板进行推演。
形如下面代码段也是成立的。
template
doubleFunc(Vv,Ww)
{
doubleu=w+v;
returnu;
}
int_tmain(intargc,_TCHAR*argv[])
{
doubled1=1.2;
doubled2=2.2;
doubled=Func(1,d2);
return1;
}
(26)有如下语句序列:
charstr[10];cin>>str;
当从键盘输入”Ilovethisgame”时,str中的字符串是
A)"Ilovethisgame"
B)"Ilovethi"
C)"Ilove"
D)"I"
答案:
D
解析:
cin认为空格是一个结束符,这是我都没有想到的。
至于你信不信,我不管,我反正是信了。
如果要获得带空格的字符串的话,用cin.get(……)
(27)有如下程序:
#include
#include
usingstd:
:
cout;
classPoint
{
public:
frienddoubledistance(constPoint&p);//p距原点的距离
Point(intxx=0,intyy=0):
x(xx),y(yy){}//①
private:
intx,y;
};
doubledistance(constPoint&p){//②
returnsqrt(p.x*p.x+p.y*p.y);
}
intmain(){
Pointp1(3,4);
cout<return0;
}
下列叙述中正确的是
A)程序编译正确
B)程序编译时语句①出错
C)程序编译时语句②出错
D)程序编译时语句③出错
答案:
C
解析:
sqrt调用不明确。
(28)有如下程序:
#include
usingnamespacestd;
classCD{
public:
~CD(){cout<<'C';}
private:
charname[80];
};
intmain(){CDa,*b,d[2];return0;}
运行时的输出结果是
A)CCCC
B)CCC
C)CC
D)C
答案:
B
解析:
*不创建自然不析构。
(29)某类中有一个无参且无返回值的常成员函数Show,则正确的Show函数原型是
A)constvoidShow();
B)voidconstShow();
C)voidShow()const;
D)voidShow(const);
答案:
C
解析:
常不常函数,表示在后头。
(30)若已定义了类Vehicle,则下列派生类定义中,错误的是
A)classCar:
Vehicle{/*类体略*/},
B)classCar:
publicCar{/*类体略*/};
C)classCar:
publicVehicle{/*类体略*/};
D)classCar:
virtualpublicVehicle{/*类体略*/};
答案:
B
解析:
B这算啥啊?
自己继承自己?
(31)有如下程序:
#include
usingnamespacestd;
classMusic
{
public:
voidsetTitle(char*str){strcpy(title,str);}
protected:
chartype[10];
private:
chartitle[20];
};
classJazz:
publicMusic
{
public:
voidset(char*str)
{
strcpy(type,"Jazz");//①
strcpy(title,str);//②
}
};
下列叙述中正确的是
A)程序编译正确一B)程序编译时语句①出错
C)程序编译时语句②出错D)程序编译时语句①和②都出错
答案:
C
解析:
发现今年特别喜欢考继承的访问属性。
(32)有如下程序:
#include
usingnamespacestd;
classInstrument{
public:
virtualvoidDisplay()=0;
};
classPiano:
publicInstrument{
public:
voidDisplay(){/*函数体程序略*/}
};
int,main(){
Instruments;
Instrument*p=0;
//...;
return0;
};
下列叙述中正确的是
A)语句“Insturment*p=0;”编译时出错
B)语句“Instruments;”编译时出错
C)类Piano中的Display函数不是虚函数
D)类Instrument是一个虚基类
答案:
B
解析:
虚基类声明指针不出错(所以A错),定义对象就有问题了(所以B对)。
Piano是虚函数,只不过没写virtual,父类写了,子类就不用写了(所以C错)。
Instrument是个抽象类,不是虚基类,注意两者的区别哦!
(33)有类定义如下:
气
classType{
public:
Type(inti){val=i;}
Typeoperator-(int);
friendTypeoperator+(Type,Type);
private:
intval;
};
若有对象定义Typecl;则下列语句序列中,错误的是
A)Type(3)+c1;
B)cl+Type(3);
C)3-cl;
D)c1-3;
答案:
C
解析:
明年还考。
(34)有如下程序:
usingnamespacestd;
#include
#include
usingnamespacestd;
intmain(){
cout<cout<<12.3456793<<_______<<98765;
return0;
}
若程厚的输出是12.345679x98765xxxxx,则划线处缺失的部分是
A)setw(10)B)setfill('x')C)setprecision(8)D)right
答案:
A
解析:
不解释。
(35)有如下程序:
#include
usingnamespacestd;
classBook{
public:
Book(char*t=""){strcpy(title,t);}
private:
chartitle[40];
};
classNovel:
publicBook
{
public:
Novel(char*t=""):
Book(t){}
char*Category()const{return"文学";}
};
intmain()
{
Book*pb;
pb=newNovel();
cout<Category();
return0;
}
若程序运行时输出结果是“文学”,则划线处缺失的语句是
A)char*Category();
B)char*Category()const;
C)virtualchar*Category()const;
D)virtualchar*Category()const=0;
答案:
D
解析:
如果是虚函数,那在Book里没有定义。
二、填空题(每空2分,共30分)
请将每一个空的正确答案写在答题卡【1】一【15】序号的横线上,答在试卷上不得分。
注意:
以命令关键字填空的必须拼写完整。
(1)一个栈的初始状态为空。
首先将元素5,4,3,2,1依次入栈,然后退栈一次,再将元素A,B,C,D依次入栈,之后将所有元素全部退栈,则所有元素退栈(包括中间退栈的元素)的顺序为__【1】__。
答案:
1,D,C,B,A,2,3,4,5
解析:
不解释
(2)在长度为n的线性表中,寻找最大项至少需要比较___【2】___次。
答案:
n-1
(3)一棵二叉树有10个度为1的结点,7个度为2的结点,则该二叉树共有__【3】___个
结点。
答案:
17
解析:
分析法:
7个度为2的节点,则叶子节点为8个,则还有2个不是叶子节点但是度为1的节点。
所以总节点数为2+7+8=17.
利用特殊不成立则一般一定不成立的办法绘制一颗符合要求的二叉树,发现节点正好17个。
(4)仅由顺序、选择(分支)和重复(循环)结构构成的程序是_【4】__程序。
答案:
结构化程序。
解析:
参见2011年3月选择题5
(5)数据库设计的四个阶段是:
需求分析,概念设计,逻辑设计和_【5】_。
(6)如果一个派生类只有一个直接基类,则该类的继承方式称为_【6】_继承;如果一个派生类同时有多个直接基类,则该类的继承方式称为_【7】_继承。
答案:
单一、多重
解析:
我猜的。
(7)运算符“+”允许重载为类成员函数,或者非成员函数。
若用operator+(c1,c2)这样的表达式来使用运算符“+”,应将“+”重载为_【8】_函数。
答案:
友元
(8)下列程序的输出是3,请填充程序中的空缺,使该行形成一个运算符重载函数的定义。
#include
usingnamespacestd;
classMyNumber{
intn;
public:
MyNumber(intk):
n(k){}
_【9】_int()const{returnn,}
};
intmain(){
MyNumbernuml(3);
cout<return0;
}
答案:
operator
解析:
强制转化符重载,新鲜。
(9)下列程序的输出结果是_【10】__。
#include
usingnamespacestd;
classBase{
public:
intm,n;
Base(inti,intj):
m(i),n(j){}
};
classDerived:
publicBase{
public:
intm,k;
Derived(inti,intj):
Base(i,j),m(i+1),k(j+1){}
};
intmain(){
Derivedd(1,5);
cout<return0;
}
答案:
265
(10)根据程序中的注释将下列缺失部分补充完整。
#include
usingnamespacestd;
classA{
char*a;
public:
A():
a(0){}
A(char*aa){//把aa所指字符串复制给a所指向的存储空间
a=__【11】__char[strlen(aa)+1];
strcpy(a,aa);
}
~A(){delete[]a;}
};
答案:
new
(11)根据程序中的注释将下列缺失部分补充完整。
classPoint{
intx,y;//点的x和y坐标
public:
Point(intxx=0,intyy=0):
x(xx),y(yy){}
};
classCircle{
Pointcenter;//圆心位置
intradius;//半径
public:
//利用cx和cy分别初始化圆心的x和y坐标
Circle(intcx,intcy,intr):
__【12】__,radius(r){}
voidarea(){cout<<3.14159*radius*radius<};
答案:
center(cx,cy)
(12)下列程序的输出结果是__【13】__。
#include
usingnamespacestd;
classBase{
intx;
public:
Base(intb):
x(b){}
virtualvoiddisplay(){cout<};
classDerived:
publicBase{
inty;
public:
Derived(intd):
Base(d),y(d){}
voiddisplay(){cout<};
intmain(){
Baseb
(1);
Derivedd
(2);
Base*p=&d;
b.display();
d.display();
p->display();
return0;
}
答案:
122
(13)一个双目运算符作为类的成员函数重载时,重载函数的参数表中有__【14】__个参数。
答案:
1
(14)派生类中的成员函数可以直接访问基类中的公有成员和__【15】__成员。
答案:
保护