1、二级 C+分类模拟 283及答案解析(总分:64.50,做题时间:90 分钟)一、选择题(总题数:40,分数:64.50)1.下列有关类继承的叙述中,错误的是_。(分数:1.00)A.继承可以实现软件复用B.虚基类可以解决由多继承产生的二义性问题C.派生类构造函数要负责调用基类的构造函数D.派生类没有继承基类的私有成员2.已知在一个类体中包含如下函数原型:VOLUMEOPER ATOR-(VOLUME)const;,下列关于这个函数的叙述中,错误的是_。(分数:1.00)A.这是运算符一的重载运算符函数B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这个函数不改变类的任何数据
2、成员的值3.下列程序的输出结果为_。 #includeiostream. h void main() char*a=“hello“, “the“, “world“; char*pa=a; pa+; cout*paendl; (分数:1.00)A.helloB.theC.wordD.hellotheworld4.在一个长度为 n的线性表中删除一个元素,最坏情况下需要移动的数据元素数目为 _ 。(分数:1.00)A.1B.n-1C.n+1D.n25.若有如下语句 #includeiostream.h void main() int x=3; do x=x-2; coutx; while(!(-x)
3、; 则上面程序段_。(分数:2.50)A.输出的是 1B.输出的是 1和-2C.输出的是 3和 0D.是死循环6.有如下程序: #includeiostream using namespace std; class Part public: Part(int x=0):val(x)coutval; Part()coutval;) private: int val; ; class Whole public: Whole(int x,int y,int z=0):p2(x),p1(y),val(z)coutval; Whole()coutval; private: Part p1,p2; int
4、 val; ; int main() Whole obj(1,2,3); return 0; 程序的输出结果是_。(分数:2.00)A.123321B.213312C.213D.1231237.如果类 A被说明成类 B的友元,则_。(分数:1.00)A.类 A的成员即类 B的成员B.类 B的成员即类 A的成员C.类 A的成员函数不得访问类 B的成员D.类 B不一定是类 A的友元8.下列定义语句中,错误的是_。(分数:2.00)A.int px*;B.char*acp10;C.char(*pac)10;D.int(*p)();9.下列叙述中正确的是(分数:1.00)A.线性链表是线性表的链式存储
5、结构B.栈与队列是非线性结构C.双向链表是非线性结构D.只有根结点的二叉树是线性结构10.有以下程序: #includeiostream using namespace std; class A private: int a; public: A(int i) a=i; void disp() couta“,“; class B private: int b; public: B(int j) b=j; void disp() coutb“,“; class C:public B,public A private: int c; public: c(int k):A(k-2),B(k+2) c
6、=k; void disp() a:disp(); B:disp(); coutcendl; ; int main() C obj(10); obj. disp(); return 0; 程序执行后的输出结果是_。(分数:1.00)A.10,10,10B.10,12,14C.8,10,12D.8,12,1011.有如下定义: int a5=1, 3, 5, 7, 9, *P=a; 下列表达式中不能得到数值 5的是_。(分数:1.00)A.a2B.a3C.*(P+2)D.*P+412.下列各组类型声明符中,含义相同的一组是_。(分数:1.00)A.unsigned long int和 longB
7、.signed short int和 shortC.unsigned short和 shortD.short int和 int13.执行语句:coutsetfill(“*“)setw(10)setfill(“#“)left123“OK“endl;return 0;)后将输出 _ 。(分数:2.00)A.123*OKB.123#OKC.123*OK*D.123#OK#14.以下不能正确定义二维数组的选项是 _ 。(分数:2.00)A.int a22=1,2;B.int a2=1,2,3,4);C.int a22=1,2,3;D.int a2=1,2,3,4;15.执行下面的程序段后,变量 k的值
8、为 _ 。 int k=3,s2; s0=k; k=s1*10;(分数:1.00)A.不定值B.33C.30D.1016.已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;,下列关于这个函数的叙述中,错误的是_ 。(分数:2.00)A.这是运算符的重载运算符函数B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这个函数不改变类的任何数据成员的值17.C+系统预定义了 4个用于标准数据流的对象,下列选项中不属于此类对象的是_。(分数:1.00)A.coutB.cinC.cerrD.cset18.若已知“int a37;”,则用指针表示数
9、组 a中的元素时,下列表示中错误的是_。(分数:1.00)A.*(a+1)5B.*(*a+3)C.*(*(a+1)D.*(*a00+2)19.面向对象的开发方法中,类与对象的关系是_。(分数:2.50)A.抽象与具体B.具体与抽象C.部分与整体D.整体与部分20.下列排序方法中,最坏情况下时间复杂度(即比较次数)低于 O(n 2 )的是_。(分数:1.00)A.快速排序B.简单插入排序C.冒泡排序D.堆排序21.下列程序的输出结果是 _ 。 #includeiostream.h main() int m=5; if(m+5) coutm; else coutm-; (分数:2.00)A.7B.
10、6C.5D.422.下列关于文件流的描述中,正确的是_。(分数:2.50)A.文件流只能完成针对磁盘文件的输入/输出B.建立一个文件流对象时,必须同时打开一个文件C.若输入流要打开的文件不存在,将建立一个新文件D.若输出流要打开的文件不存在,将建立一个新文件23.一个满二叉树其深度为 4,则其叶子节点的个数为 _ 。(分数:1.00)A.8B.16C.32D.424.面向对象程序设计将数据与 _ 放在一起,作为一个互相依存、不可分割的整体来处理。(分数:2.00)A.信息B.数据抽象C.数据隐藏D.对数据的操作25.在软件开发中,需求分析阶段产生的主要文档是_。(分数:1.00)A.软件集成测
11、试计划B.软件详细设计说明书C.用户手册D.软件需求规格说明书26.有如下程序: #includeiostream using namespace std; class Publication /出版物类 char name30; public: Publication(char *name=“未知名称“) strcpy(this-name,name); const cha * getName()constreturn name; virtual const char * getType()constreturn“未知类型“; ; class Book:public Publication /
12、书类 public: Book(char *name): Publication(name) virtual const char * getType()constreturn“书“; ; void showPublication(Publication int main() Book book(“精彩人生“); showPublication(book); return 0; 运行时的输出结果是_。(分数:2.00)A.未知类型:未知名称B.未知类型:精彩人生C.书:未知名称D.书:精彩人生27.有如下程序: # include ioslreclm Using namespace std;
13、class Base public: Base(int x=0):valB(x)coutvalB; Base()coutvalB; Private: int valB; ; class, Derived: public Base public: Dcrived(int x=0,int y=0):Base(x),valD(y) coutvalD; Derived()coutvalD; private: int valD; ; int main() Derived obj12(2,3); return 0; 运行时的输出结果是 _ ,(分数:2.50)A.2332B.2323C.3232D.322
14、328.下面程序的运行结果是 _ 。 #includeiostream.h int x=5; int fun(int a) int c; C=X*a; retum c; void main() int x=3,a=4; x=x+fun(a); cout“x“”Xendl; (分数:2.00)A.x=15B.x=17C.x=23D.x=2529.运行以下程序后,如果从键盘上输入 shose后回车,则输出结果为 _。 # includeiostream.h void main() int v1=0,v2=0,k=0; char ch80; cinch; while(chk) switch(chk)
15、 case “s“; case “h“; default: v1+1; case “o“: v2+; k+; coutv1 “,“v2end1; (分数:2.00)A.2, 0B.5, 0C.4, 5D.2, 530.下列关于运算符重载的叙述中,正确的是_。(分数:3.00)A.通过运算符重载,可以定义新的运算符B.有的运算符只能作为成员函数重载C.若重载运算符+,则相应的运算符函数名是+D.重载一个二元运算符时,必须声明两个形参31.有如下程序: #includeiostream using namespace std; class Point public: static int numb
16、er; public: Point() number+; Point() number -; ; int Point:number=0; int main() Point *ptr; Point A, B; Point *ptr_point=new Point3; ptr=ptr_point; Point C; coutPoint:numberendl; deleteptr; return 0; 执行这个程序的输出结果是_。(分数:1.00)A.3B.4C.6D.732.有如下说明: int a10=1,2,3,4,5,6,7,8,9,10,*p=a; 则数值为 9的表达式是_。(分数:1.0
17、0)A.*p+9B.*(p+8)C.*p+=9D.p+833.以下程序的输出结果是 _ 。 #includeiostream.h void func(char*m) +m: cout*mend1; void main() static char*a=“MORNING“,“AFTERTOON“,“EVENING“; char*n: n=a; func(n); (分数:1.00)A.为空B.MORNINGC.AFTERTOOND.EVENING34.有如下程序: #include iostream using namespace std; class BASE public: BASE()cout
18、“BASE“; ; class DERIVED: public BASE public: DERIVED() cout“DERIVED“; int main() DERIVED x; return 0; 执行后的输出结果是 _ 。(分数:2.00)A.BASEB.DERIVEDC.BASEDERIVEDD.DERIVEDBASE35.有如下程序: #includeiostream #includeiomanip using namespace std; int main() int s=123,234; coutrightsetfill(“*“)setw(6); for(int i=0;i2;
19、i+)coutsiendl; return 0; 运行时的输出结果是_。(分数:2.00)A.123234B.*123234C.*123*234D.*123234*36.有函数模板声明和一些变量定义如下: templateclass T1,class T2,class T3T1 sum(T2,T3); double d1,d2; 则下列调用中,错误的是_。(分数:3.00)A.sumdouble,double,double(d1,d2);B.sumdouble,double(d1,d2);C.sumdouble(d1,d2);D.sum(d1,d2);37.有如下程序: #includeios
20、tream #includestring using namespace std; class Instrument public: Instrument(string t=“乐器“,string n=“无名“):type(t),name(n) virtual string GetType() constreturn“乐器“; virtual string GetName() constreturn“无名“; protected: stnng type,name; ; class Piano:public Instrument public: Piano(string n,string t=“
21、钢琴“):lnstrument(t,n) string CetType() constreturn“钢琴“; string GetName() constreturn name; ; int main() Instrument * pi=new Piano(“星空“); coutpi-GetType()“-“pi-GetName(); delete pi; return 0; 运行时的输出结果是_。(分数:1.00)A.钢琴-星空B.钢琴-无名C.乐器-星空D.乐器-无名38.下列关于输入流类成员函数 getline()的描述中,错误的是_。(分数:2.00)A.该函数是用来读取键盘输入的字符
22、串的B.该函数读取的字符串长度是受限制的C.该函数读取字符串时,遇到终止符便停止D.该函数读取字符串时,可以包含空格39.下面程序的输出结果是_。 #include iostream using namespace std; int main() int n=10; while(n7) n-; coutn“,“; coutendl; (分数:2.50)A.10,9,8,B.9,8,7,C.10,9,8,7,D.9,8,7,6,40.下列关于类模板的叙述中,错误的是_。(分数:1.00)A.类模板描述的是一组类B.可以为类模板的参数设置默认值C.类模板的成员函数可以是函数模板D.定义类模板时只允
23、许有一个模板参数二级 C+分类模拟 283答案解析(总分:64.50,做题时间:90 分钟)一、选择题(总题数:40,分数:64.50)1.下列有关类继承的叙述中,错误的是_。(分数:1.00)A.继承可以实现软件复用B.虚基类可以解决由多继承产生的二义性问题C.派生类构造函数要负责调用基类的构造函数D.派生类没有继承基类的私有成员 解析:解析 3 种继承方式中,派生类继承了基类的私有成员,但不能被直接访问,可以通过派生类的友元函数去访问基类的私有成员。2.已知在一个类体中包含如下函数原型:VOLUMEOPER ATOR-(VOLUME)const;,下列关于这个函数的叙述中,错误的是_。(分
24、数:1.00)A.这是运算符一的重载运算符函数B.这个函数所重载的运算符是一个一元运算符 C.这是一个成员函数D.这个函数不改变类的任何数据成员的值解析:解析 本题考核运算符的重载。题中语句为运算符一这是一个二元运算符,且是作为常成员函数来重载的,所以它不能更新对象的数据成员,也不能调用该类中没有用 const修饰的成员函数。3.下列程序的输出结果为_。 #includeiostream. h void main() char*a=“hello“, “the“, “world“; char*pa=a; pa+; cout*paendl; (分数:1.00)A.helloB.the C.word
25、D.hellotheworld解析:解析 本题主要考查的是指针数组和指向指针的指针之间的关系,其中 a是指针数组,pa 是指向指针数组行的指针,所以 pa自加 1相当于指向下一行。4.在一个长度为 n的线性表中删除一个元素,最坏情况下需要移动的数据元素数目为 _ 。(分数:1.00)A.1B.n-1 C.n+1D.n2解析:解析 在一般情况下,要删除第 i个元素时,首先是从第 i+1个元素开始,直到第 n个元素之间共 n-i个元素依次向前移动一个位置,删除结束后,线性表的长度减 1。最坏情况指的是删除线性表的第一个元素,则需要移动表中第 1个元素以外所有的元素,答案为 B。5.若有如下语句 #
26、includeiostream.h void main() int x=3; do x=x-2; coutx; while(!(-x); 则上面程序段_。(分数:2.50)A.输出的是 1B.输出的是 1和-2 C.输出的是 3和 0D.是死循环解析:解析 do.while 语句的一般格式为“do 循环体语句 while(表达式);”,先执行循环体语句一次,再判断表达式的值,若为真则继续执行循环,否则终止循环。本题中,先执行 x=x-2,即为 1。判断表达式的值,!(-x)为真,x=0,继续循环。再次执行循环体语句后,x=-2,此时表达式的值为 0,结束循环。6.有如下程序: #include
27、iostream using namespace std; class Part public: Part(int x=0):val(x)coutval; Part()coutval;) private: int val; ; class Whole public: Whole(int x,int y,int z=0):p2(x),p1(y),val(z)coutval; Whole()coutval; private: Part p1,p2; int val; ; int main() Whole obj(1,2,3); return 0; 程序的输出结果是_。(分数:2.00)A.1233
28、21B.213312 C.213D.123123解析:解析 此题考查的是类的构造与析构。建立类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序(自左向右)接着执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序,最后执行自身的构造函数。析构顺序与之相反。本题中,Whole类中有两个 Part类的成员 p1和 p2,根据它们定义的顺序,先构造 p1再构造 p2。所以,首先被构造的是p1(y),输出 2;第二个被构造的是 p2(x),输出 1;最后调用析构函数,输出 val的值 3;析构函数调用顺序与构造函数相反。故最后输出 213312。7
29、.如果类 A被说明成类 B的友元,则_。(分数:1.00)A.类 A的成员即类 B的成员B.类 B的成员即类 A的成员C.类 A的成员函数不得访问类 B的成员D.类 B不一定是类 A的友元 解析:解析 本题考查的是友元类的定义:类 A为类 B的友元类,则类 A的所有成员函数都是类 B的友元函数,但反之则不一定成立。8.下列定义语句中,错误的是_。(分数:2.00)A.int px*; B.char*acp10;C.char(*pac)10;D.int(*p)();解析:9.下列叙述中正确的是(分数:1.00)A.线性链表是线性表的链式存储结构 B.栈与队列是非线性结构C.双向链表是非线性结构D
30、.只有根结点的二叉树是线性结构解析:解析 一个非空的数据结构如果满足下列两个条件:(1)有且只有一个根结点; (2)每一个结点最多有一个前件,也最多有一个后件。则称为线性结构。线性链表是线性表的链式存储结构,选项 A的说法是正确的。栈与队列是特殊的线性表,它们也是线性结构,选项 B的说法是错误的;双向链表是线性表的链式存储结构,其对应的逻辑结构也是线性结构,而不是非线性结构,选项 C的说法是错误的;二叉树是非线性结构,而不是线性结构,选项 D的说法是错误的。因此,本题的正确答案为 A。10.有以下程序: #includeiostream using namespace std; class A
31、 private: int a; public: A(int i) a=i; void disp() couta“,“; class B private: int b; public: B(int j) b=j; void disp() coutb“,“; class C:public B,public A private: int c; public: c(int k):A(k-2),B(k+2) c=k; void disp() a:disp(); B:disp(); coutcendl; ; int main() C obj(10); obj. disp(); return 0; 程序执
32、行后的输出结果是_。(分数:1.00)A.10,10,10B.10,12,14C.8,10,12D.8,12,10 解析:解析 本题中,派生类 C具有多重继承关系,所以在派生类 C的构造函数中应该包含基类 A和类B的成员初始化列表。11.有如下定义: int a5=1, 3, 5, 7, 9, *P=a; 下列表达式中不能得到数值 5的是_。(分数:1.00)A.a2B.a3 C.*(P+2)D.*P+4解析:解析 本题考查指向数组的指针,本题中指针变量 p指向数组 a,直接使用数组下标即可取值,数组下标是从 0开始标号的,所以 a2能取到 5,而 a3取不到 5,C 选项中使用指针后移方法能
33、够取到5,D 选项中*p 为 1,所以*p+4 为 5。12.下列各组类型声明符中,含义相同的一组是_。(分数:1.00)A.unsigned long int和 longB.signed short int和 short C.unsigned short和 shortD.short int和 int解析:解析 本题考查整型变量的类型,A、C 选项中前者为无符号的,后者为有符号的,D 选项中short int为 2个字节,int 为 4个字节。13.执行语句:coutsetfill(“*“)setw(10)setfill(“#“)left123“OK“endl;return 0;)后将输出 _
34、 。(分数:2.00)A.123*OKB.123#OK C.123*OK*D.123#OK#解析:14.以下不能正确定义二维数组的选项是 _ 。(分数:2.00)A.int a22=1,2;B.int a2=1,2,3,4); C.int a22=1,2,3;D.int a2=1,2,3,4;解析:15.执行下面的程序段后,变量 k的值为 _ 。 int k=3,s2; s0=k; k=s1*10;(分数:1.00)A.不定值 B.33C.30D.10解析:解析 解本题考核数组元素的初值及其引用。若数组为 auto型,且没有进行初始化,其元素的值为不确定。本程序中,虽然给 s0赋了一个初值,但
35、 s1的值依旧是不确定的,所以执行语句“k=s1*10”后,k 的值也不确定的。16.已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;,下列关于这个函数的叙述中,错误的是_ 。(分数:2.00)A.这是运算符的重载运算符函数 B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这个函数不改变类的任何数据成员的值解析:解析 重载的是一个二元运算符“一”,所以此题选择 A。17.C+系统预定义了 4个用于标准数据流的对象,下列选项中不属于此类对象的是_。(分数:1.00)A.coutB.cinC.cerrD.cset 解析:解析 C+标准
36、数据流的对象分别是 cout、cin、cerr、clog,所以本题答案为 D。18.若已知“int a37;”,则用指针表示数组 a中的元素时,下列表示中错误的是_。(分数:1.00)A.*(a+1)5 B.*(*a+3)C.*(*(a+1)D.*(*a00+2)解析:解析 二维数组 a中有三个元素,每个元素都是包含 7个元素的一维数组 a0,a1,a2,另外二维数组名相当于一个指向指针的指针,一维数组的数组名相当于指针,所以*a 指向一维数组 a0,*(a+1)指向一维数组 a1,*(a+2)指向一维数组 a2,所以选项 B中,*a+3 指向一维数组 a0的首地址(列地址)向后移动 3位,即
37、指向 a03,*(*a+3)表示 a03,正确;选项 C中,*(a+1)指向一维数组a1,同时也指向一维数组 a1的第一个元素,所以*(*(a+1)表示 a10,正确;选项 D中, if(m+5) coutm; else coutm-; (分数:2.00)A.7B.6 C.5D.4解析:解析 此题中,因为 m+5 成立(此时 m的值变为 6),所以执行语句 coutm;输出结果为6。22.下列关于文件流的描述中,正确的是_。(分数:2.50)A.文件流只能完成针对磁盘文件的输入/输出B.建立一个文件流对象时,必须同时打开一个文件C.若输入流要打开的文件不存在,将建立一个新文件D.若输出流要打开
38、的文件不存在,将建立一个新文件 解析:解析 本题考查的知识点是输入/输出文件流。如果以 ios_base:in模式打开文件而文件又不存在,通过 fail()可测出打开失败(返回值为 true)。如果以 ios_base:out模式打开文件而文件又不存在,则将自动建立一个新文件。因此可以用输入文件流来检测文件是否存在,利用输出文件流创建文件。23.一个满二叉树其深度为 4,则其叶子节点的个数为 _ 。(分数:1.00)A.8 B.16C.32D.4解析:解析 若深度为 k,则叶子节点的个数为 2k-1,这是满二叉树的性质之一。24.面向对象程序设计将数据与 _ 放在一起,作为一个互相依存、不可分
39、割的整体来处理。(分数:2.00)A.信息B.数据抽象C.数据隐藏D.对数据的操作 解析:25.在软件开发中,需求分析阶段产生的主要文档是_。(分数:1.00)A.软件集成测试计划B.软件详细设计说明书C.用户手册D.软件需求规格说明书 解析:解析 需求分析阶段的工作可以概括为:需求获取、需求分析、编写需求规格说明书、需求评审四个方面。所以选择 D。26.有如下程序: #includeiostream using namespace std; class Publication /出版物类 char name30; public: Publication(char *name=“未知名称“)
40、strcpy(this-name,name); const cha * getName()constreturn name; virtual const char * getType()constreturn“未知类型“; ; class Book:public Publication /书类 public: Book(char *name): Publication(name) virtual const char * getType()constreturn“书“; ; void showPublication(Publication int main() Book book(“精彩人生“
41、); showPublication(book); return 0; 运行时的输出结果是_。(分数:2.00)A.未知类型:未知名称B.未知类型:精彩人生C.书:未知名称D.书:精彩人生 解析:解析 因为类 Book继承自基类 Publication,所以在类 Book中的虚常成员函数* getType() return“书“;)就会覆盖基类中的虚常成员函数* getType()const return“未知类型“;,所以在主函数中调用函数 showPublication(book)时,getType()函数的输出的结果是“书”,getName()函数的输出结果为“精彩人生”。27.有如下程
42、序: # include ioslreclm Using namespace std; class Base public: Base(int x=0):valB(x)coutvalB; Base()coutvalB; Private: int valB; ; class, Derived: public Base public: Dcrived(int x=0,int y=0):Base(x),valD(y) coutvalD; Derived()coutvalD; private: int valD; ; int main() Derived obj12(2,3); return 0; 运
43、行时的输出结果是 _ ,(分数:2.50)A.2332 B.2323C.3232D.3223解析:解析 本题使用析构函数。28.下面程序的运行结果是 _ 。 #includeiostream.h int x=5; int fun(int a) int c; C=X*a; retum c; void main() int x=3,a=4; x=x+fun(a); cout“x“”Xendl; (分数:2.00)A.x=15B.x=17C.x=23 D.x=25解析:29.运行以下程序后,如果从键盘上输入 shose后回车,则输出结果为 _。 # includeiostream.h void ma
44、in() int v1=0,v2=0,k=0; char ch80; cinch; while(chk) switch(chk) case “s“; case “h“; default: v1+1; case “o“: v2+; k+; coutv1 “,“v2end1; (分数:2.00)A.2, 0B.5, 0C.4, 5 D.2, 5解析:30.下列关于运算符重载的叙述中,正确的是_。(分数:3.00)A.通过运算符重载,可以定义新的运算符B.有的运算符只能作为成员函数重载 C.若重载运算符+,则相应的运算符函数名是+D.重载一个二元运算符时,必须声明两个形参解析:解析 此题考查的是运算
45、符重载。C+中,“=”、“”、“()”、“-”以及所有的类型转换符只能作为成员函数重载,故 B选项正确;运算符重载只是赋予已有的运算符多重含义,并不是定义新的运算符;运算符函数的函数名就是在运算符前加上关键字 operator。31.有如下程序: #includeiostream using namespace std; class Point public: static int number; public: Point() number+; Point() number -; ; int Point:number=0; int main() Point *ptr; Point A, B; Point *ptr_point=new Point3; ptr=ptr_point; Point C; coutPoint:numberendl; deleteptr; return 0; 执行这个程序的输出结果是_。(分数:1.00)A.3B.4C.6 D.7解析:解析 本题考查默认构造函数,题目中定义一个对象 A、B 以及对象数组 Point3,又定义了对象 C,共执行 6次构造函数,number 变为了 6,所以本题答案为 C。32.有