1、二级 C+模拟 488及答案解析(总分:171.50,做题时间:90 分钟)一、选择题(总题数:40,分数:71.50)1.如果表达式 x*y+z中,“*”是作为友元函数重载的,“+”是作为友元函数重载的,则该表达式还可为(分数:1.00)A.operator+(operator*(x,y),z)B.operator+(operator*(x,y),Z)C.operator*(operator+(x,y),z)D.operator+(operator*(x,y)2.函数定义为 Fun(int B.fun(20+n);C.fun(n);D.funD( class Base protected:
2、Base()cout“A“; Base(char C)coutc; ; class Derived:public Base public: Derived(char C)coutc; ; int main() Derived d1(“B“); return 0; 执行这个程序屏幕上将显示输出_。(分数:2.00)ABB.BAC.ABD.BB6.已知类 A有公用数据成员 a,并重载了“”运算符,且有 A obj2;const A*ptr new A;则下列语句错误的是 _ 。(分数:2.00)A.ptr-a=100;B.ptr=C.ptr+;D.obj2=*ptr;7.有如下程序: #inclu
3、deiostream using namespace std; void f1(int void f2(int x)+x; int main() int x=10, y=12; f1(x); f2(y); coutx+yendl; return 0; 运行这个程序的输出结果是_。(分数:2.50)A.22B.23C.24D.258.已知语句 int m=10;则下列引用的表示中正确的是(分数:2.00)A.intB.intC.intD.float9.已知 n是一个 int 型变量,下列语句中错误的是_ 。(分数:2.00)A.long *p=new long n;B.long pn;C.lon
4、g *p=new long (n);D.long p1010.有下列程序: #include stdio.h void main() int s12=1,2,3,4,4,3,2,1,1,1,2,3,c5=0,i; for(i=0;i12;i+)csi+; for(i=1;i5;i+)printf(“%d“,ci); printf(“/n“) (分数:2.50)A.1 2 3 4B.2 3 4 4C.4 3 3 2D.1 1 2 311.以下关键字不能用来声明类的访问权限的是 _ 。(分数:1.00)A.publicB.staticC.protectedD.private12.语句 ofstre
5、am f(“SALARY.DAT“,ios:appl ios:binary);的功能是建立流对象 f,试图打开文件SALARY.DAT并与之连接,并且 _ 。(分数:2.00)A.若文件存在,将文件写指针定位于文件尾;若文件不存在,建立一个新文件B.若文件存在,将其置为空文件;若文件不存在,打开失败C.若文件存在,将文件写指针定位于文件首;若文件不存在,建立一个新文件D.若文件存在,打开失败;若文件不存在,建立一个新文件13.关于在调用模板函数时模板实参的使用,下列表述中正确的是_。(分数:2.50)A.对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略B.
6、对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略C.对于虚拟类型参数所对应的模板实参,若能够省略则必须省略D.对于常规参数所对应的模板实参,任何情况下都不能省略14.软件设计中划分模块的一个准则是_。(分数:2.50)A.低内聚低耦合B.高内聚低耦合C.低内聚高耦合D.高内聚高耦合15.下列 C+标点符号中表示一条语句结束的是_。(分数:2.50)A.#B.;C./D.16.下列程序的运行结果是 #includeiostream.h class A int a; public: A( ) a0; A(int aa) aaa; cout a; ; void m
7、ain( ) A x,y(2) ,z(3) ; cout endl; (分数:2.00)A.00B.23C.34D.2517.生成派生类对象时,派生类构造函数调用基类构造函数的条件是_。(分数:2.00)A.无需任何条件B.基类中显式定义了构造函数C.派生类中显式定义了构造函数D.派生类构造函数明确调用了基类构造函数18.下列关于顺序存储结构叙述中错误的是 _ 。(分数:2.00)A.存储密度大B.逻辑上相邻的结点物理上不必相邻C.可以通过计算直接确定第 i个结点的存储地址D.插入、删除运算操作不方便19.有如下类定义: class B public: void fun1() private:
8、 void fun2() protected: void fun3() ; class D:public B protected: void fun4() ; 若 obj是类 D的对象,则下列语句中不违反访问控制权限的是_。(分数:1.00)A.obj.fun1();B.obj.fun2();C.obj.fun3();D.obj.fun4();20.已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;,下列关于这个函数的叙述中,错误的是(分数:2.00)A.这是运算符一的重载运算符函数B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这
9、个函数不改变类的任何数据成员的值21.下列字符串中不能作为 C+标识符使用的是_。(分数:2.00)A.DOUBLEB.abcC._5_D.xyz22.下列关于运算符重载的描述中,正确的是_。(分数:1.00)A.运算符重载为成员函数时,若参数表中无参数,重载的是一元运算符B.一元运算符只能作为成员函数重载C.二元运算符重载为非成员函数时,参数表中有一个参数D.C+中可以重载所有的运算符23.下列叙述中正确的是_。(分数:1.00)A.软件测试应该由程序开发者来完成B.程序经调试后一般不需要再测试C.软件维护只包括对程序代码的维护D.以上三种说法都不对24.下列程序的执行结果是_。 #incl
10、udeiostream.h #includestdlib.h class TestClass public: int x,y; TestClass () x=y=0; TestClass (int a,int b)x=a;y=b; void disp() cout“x=“x“,y=“yend1; void main() TestClass s1(2,3); s1.disp(); (分数:2.00)A.x=2,y=2B.x=2,y=3C.x=3,y=2D.x=3,y=325.设树 T的度为 4,其中度为 1,2,3,4 的结点个数分别为 4,2,1,1。则 T中的叶子结点数为(分数:1.00)A
11、.5B.6C.7D.826.面向对象的开发方法中,类与对象的关系是_。(分数:2.50)A.抽象与具体B.具体与抽象C.部分与整体D.整体与部分27.下列语句中,错误的是_。(分数:1.00)A.const int buffer=256;B.const double*point;C.int const buffer=256;D.double*const point;28.在对函数进行原型声明时,下列语法成分中,不需要的是_。(分数:2.50)A.函数返回类型B.函数参数列表C.函数名D.函数体29.有如下程序: #includeiostream Using namespace std; Cla
12、ss Amount int amount; public; Amount(int n=0):amount(n) Int getAmount()constreturn amount; Amount return ; ; int main() Amount x(3),y(7); x+=y; coutx.getAmount()endl; return 0; 已知程序的运行结果是 10,则下划线处缺失的表达式是_。(分数:2.00)A.*thisB.thisC. class Boat; class Car public: Car(int i):weight(i) friend int Total(co
13、nst Car / private: int weight; ; class Boat public: Boat(int i):weight(i) friend int Total(const Car private: int weight; ; int Total(const Car int main() Car c(10); Boat b(8); cout“The total weight is“Total(c, b)endl; / return 0; 下列关于程序的描述中,正确的是_。(分数:2.50)A.程序编译正确B.程序编译时语句出错C.程序编译时语句出错D.程序编译时语句出错32
14、.以下程序的输出结果是 _ 。 #includeiostream.h main() int b33=0,1,2,0,1,2,0,1,2,ij,t=1; for(i=0;i3;i+) for(j=i;j=i;j+) t=t+bibjj; coutt; (分数:2.00)A.3B.4C.1D.933.有如下类定义: class Bag public: Bag(int p=200, char s=“M“):price(p), size(s) coutsize; private: int price; char size; ; 若执行语句 Bag Alice, Kelly(Mice), *Twins2
15、, F44; 则输出结果为_。(分数:1.00)A.MMMMMMMMB.MMMMMMC.MMMMMD.MMMM34.有如下类定义: class Test public: Test()a=0;c=0;/ int f(int a)constthis-a=a;/ static int g()return a;/ voidh(intb)Test:b=b;/ private: int a; static int b; const int c; ; int Test:b=0; 在标注号码的行中,能被正确编译的是_。(分数:1.00)A.B.C.D.35.下列程序的运行结果是 _ 。 #includeios
16、tream.h void fun(int *a, int *b) int *k; k=a; a=b; b=k; void main() int a=2OO4,b=9,*x= fun(x, y); couta“ “bend1;(分数:2.00)A.20049B.92004C.00D.编译时出错36.有如下程序: #includeiostream using namespace std; class Name char name20; public: Name() strcpy(name, “); cout“?“; Name(char *fname) strcpy(name, fname); co
17、ut“?“; ; int main() Name names3=Name(“张三“), Name(“李四“); return 0; 运行此程序输出符号?的个数是_。(分数:2.50)A.0B.1C.2D.337.有如下模板声明: templatetypename T1,typename T2 class A; 下列声明中,与上述声明不等价的是_。(分数:1.00)A.templateclass T1,class T2class A;B.templateclass T1,typename T2class A;C.templatetypename T1,class T2class A;D.temp
18、latetypename T1,T2class A;38.有以下程序: #include iostream using namespace std; int main() int num23,*p; int t,i,j,k=10; p=num0; for(i=0;i2;i+) for(j=0;j3;j+) k+; *p=k; for(t=2;t*p;t+) if(!(*pt) j-; *p-; break; *p+; cout*(p-1)end1; return 0; 程序运行后的输出结果是 _ 。(分数:1.00)A.19B.11C.29D.2339.下列程序的输出结果是_。 #includ
19、eiostream.h void main() char*str=“12123434“; int x1=0,x2=0,x3=0,x4=0,i; for(i=0;stri!=“/0“;i+) switch (stril) case“1“:x4+; case“2“:x3+; case“3“:x2+; case“4“:x1+; coutx1“,“x2“,“x3“,“x4; (分数:1.00)A.8,6,4,1B.8,6,3,2C.8,8,4,1D.8,6,4,240.在位运算中,操作数每右移一位,其结果相当于(分数:1.00)A.操作数乘以 2B.操作数除以 2C.操作数乘以 4D.操作数除以 4二
20、、基本操作题(总题数:1,分数:30.00)41.请使用 VC6或使用答题菜单打开考生文件夹 proj1下的工程 proj1,此工程中含有一个源程序文件proj1.cpp。其中位于每个注释“/ERROR *found*”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为: Base:Good Luck! Derived:Good Luck! 注意:只修改注释“/ERROR *found*”的下一行语句,不要改动程序中的其他内容。 /proj1.cpp #include iostream #include cstring using namespace std; class Base /
21、 ERROR * found* private: char* msg; public: Base(char* str) / ERROR * found* msg=new charstrlen(str); strcpy (msg, str); cout “Base: “ msg endl; / ERROR * found* Base() delete msg; ; class Derived:public Base public: Derived (char* str):Base(str) void Show () cout “Derived:“ msg endl; ; int main ()
22、Derived obj (“Good Luck! “); obj.Show(); return 0; (分数:30.00)_三、简单应用题(总题数:1,分数:30.00)42.请使用 VC6或使用【答题】菜单打开 proj2 下的工程 proj2,该工程中含有一个源程序文件proj2.cpp。其中定义了类 Set和用于测试该类的主函数 main。类 Set是一个用于描述字符集合的类,在该字符集合中,元素不能重复(将“a”和“A”视为不同元素),元素最大个数为 100。为该类实现一个构造函数 Set(char * s),它用一个字符串来构造一个集合对象,当字符串中出现重复字符时,只放入一个字符。
23、此外,还要为该类实现另一个成员函数 InSet(char c),用于测试一个字符 c是否在一个集合中,若在,则返回 true;否则返回 false。 构造函数 Set和成员函数 InSet的部分实现代码已在文件 proj2.cpp中给出,请在标有注释“/ TODO:”的行中添加适当的代码,将这两个函数补充完整,以实现其功能。 提示:在实现构造函数时,可以调用 InSet函数来判断一个字符是否已经在集合中。 注意:只在指定位置编写适当代码,不要改动程序中的其他内容,也不要删除或移动“/ *found*”。 /proj2.cpp #include iostream using namespace
24、std; const int MAXNUM = 100; class Set private: int num; /元素个数 char setdataMAXNUM; /字符数组,用于存储集合元素 public: Set(char *s); /构造函数,用字符串 s构造一个集合对象 bool InSet(char c); /判断一个字符 c是否在集合中,若在,返回 true,否则返回 false void Print() const; /输出集合中所有元素 ; Set:Set(char * s) num = 0; while (* s) / *found* if (_) /TODO:添加代码,测
25、试元素在集合中不存在 / *found* _; /TODO:添加一条语句,加入元素至集合中 s+; bool Set:InSet (char c) for (int i = 0; i num; i+) / *found* if (_) /TODO:添加代码,测试元素 c是否与集合中某元素相同 / *found* _; /TODO:添加一条语句,进行相应处理 return false; void Set:Print () const cout “Set elements:“ endl; for(int i = 0; i num; i+) cout setdatai “; cout endl; i
26、nt main() char sMAXNUM; cin.getline (s, MAXNUM - 1); /从标准输入中读入一行 Set setobj(s); /构造对象 setobj setobj.Print(); /显示对象 setobj中内容 return 0; (分数:30.00)_四、综合应用题(总题数:1,分数:40.00)43.请使用 VC6或使用【答题】菜单打开 proj3 下的工程文件 proj3。本题创建一个小型字符串类,字符串长度不超过 100。程序文件包括 proj3.h、proj3.cpp、writeToFile.obj。补充完成重载赋值运算符函数,完成深复制功能。
27、屏幕上输出的正确结果应该是: Hello! Happy new year! 要求: 补充编制的内容写在“/ *333*”与“/ *666*”两行之间。不得修改程序的其他部分。 注意: 程序最后调用 writeToFile函数,使用另一组不同的测试数据,将不同的运行结果输出到文件 out.dat中。输出函数 writeToFile已经编译为 obj文件。 /proj3.h #include iostream #include iomanip using namespace std; class MiniString public: friend ostream return output; fr
28、iend istream /用于输入的临时数组 temp0 = “/0“; /初始为空字符串 input setw(100) temp; int inLen = strlen(temp); /输入字符串长度 if(inLen ! = 0) s.length = inLen; /赋长度 if (s.sPtr! = 0) deletes.sPtr; /避免内存泄漏 s.sPtr = new chars.length +1; strcpy(s.sPtr, temp); /如果 s不是空指针,则复制内容 else s.sPtr0 = “/0“; /如果 s是空指针,则为空字符串 return inpu
29、t; void modString(const char * string2 ) /更改字符串内容 if (string2 ! = 0) /如果 string2不是空指针,则复制内容 if (strlen(string2) ! = length) length = strlen (string2); delete sPtr; sPtr = new char length +1; /分配内存 strcpy(sPtr, string2); else sPtr 0 = “/0“; /如果 string2是空指针,则为空字符串 MiniString MiniString (const char * s
30、 = “ “):length(s ! = 0) ? strlen(s):0) /构造函数 s Ptr = 0; if (length! =0) setString(s); MiniString() /析构函数 delete sPtr; private: int length; /字符串长度 char * sPtr; /指向字符串起始位置 void setString(const char * string2) /辅助函数 sPtr = new charstrlen(string2) +1; /分配内存 if(string2 ! = 0) strcpy(sPtr, string2); /如果 s
31、tring2不是空指针,则复制内容 else sPtr0 = “/0“; /如果 string2是空指针,则为空字符串 ; /proj3.cpp #include iostream #include iomanip using namespace std; #include “proj3.h“ MiniString void writeToFile(const char *); str2 = str1; /使用重载的赋值运算符 str2.modString (“Happy new year!“); cout str1 “/n“; cout str2 “/n“; writeToFile (“ “
32、); return 0; (分数:40.00)_二级 C+模拟 488答案解析(总分:171.50,做题时间:90 分钟)一、选择题(总题数:40,分数:71.50)1.如果表达式 x*y+z中,“*”是作为友元函数重载的,“+”是作为友元函数重载的,则该表达式还可为(分数:1.00)A.operator+(operator*(x,y),z) B.operator+(operator*(x,y),Z)C.operator*(operator+(x,y),z)D.operator+(operator*(x,y)解析:解析 C+中用成员函数重载 x*y为:x.operator * (y),用友元函
33、数重载 x*y为:operator *(x,y),用成员函数重载 x+y为:x.operator+(y),用友元函数重载 x+y为:operator+(x,y)。2.函数定义为 Fun(int B.fun(20+n);C.fun(n); D.funD( class Base protected: Base()cout“A“; Base(char C)coutc; ; class Derived:public Base public: Derived(char C)coutc; ; int main() Derived d1(“B“); return 0; 执行这个程序屏幕上将显示输出_。(分数
34、:2.00)ABB.BAC.AB D.BB解析:解析 此题考查的是派生类对象的构造。建立派生类对象时,构造函数的执行顺序是:执行基类的构造函数,调用顺序按照各个基类被被继承时声明的顺序;执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序;执行派生类的构造函数。此题中,在建立派生类 Derived的对象 d1时会先调用基类 Base的构造,调用的是默认构造函数,输出字符A;然后调用自身的构造函数,输出B;故程序的输出结果是:AB。6.已知类 A有公用数据成员 a,并重载了“”运算符,且有 A obj2;const A*ptr new A;则下列语句错误的是 _ 。(分数:2.00)
35、A.ptr-a=100; B.ptr=C.ptr+;D.obj2=*ptr;解析:解析 本题考查 const修饰符的作用。注意:const 位置不同,其修饰的部分也是不同的。本题中 const修饰的是 ptr所指的对象本身,所以,ptr 是可以重新指向新的对象,而 ptr-a 则无法被更新。7.有如下程序: #includeiostream using namespace std; void f1(int void f2(int x)+x; int main() int x=10, y=12; f1(x); f2(y); coutx+yendl; return 0; 运行这个程序的输出结果是_
36、。(分数:2.50)A.22B.23 C.24D.25解析:解析 该题考查的是虚函数的调用。8.已知语句 int m=10;则下列引用的表示中正确的是(分数:2.00)A.int B.intC.intD.float解析:解析 本题考查 C+中引入的新类型:引用。引用表示变量的别名,使用方式同变量,效果同指针。引用不能用常数进行赋值,引用的类型必须一致,引用在使用之前必须初始化。9.已知 n是一个 int 型变量,下列语句中错误的是_ 。(分数:2.00)A.long *p=new long n;B.long pn; C.long *p=new long (n);D.long p10解析:解析
37、静态数组的大小应确定。10.有下列程序: #include stdio.h void main() int s12=1,2,3,4,4,3,2,1,1,1,2,3,c5=0,i; for(i=0;i12;i+)csi+; for(i=1;i5;i+)printf(“%d“,ci); printf(“/n“) (分数:2.50)A.1 2 3 4B.2 3 4 4C.4 3 3 2 D.1 1 2 3解析:解析 本题考查对 f。r 循环的使用,首先给两个数组赋值,第一个 for循环从 0开始循环 12次遍历 s教组的各个元素,数组将 s中的元素值作为 c数组中的下标,然后自加,使相应的值自加,当
38、i=0,cs0+为 c1+,其值变为 1,当执行 i=1,2,11 后,c1、c2、c3、c4分别为4、3、3、2,故选项 C正确。11.以下关键字不能用来声明类的访问权限的是 _ 。(分数:1.00)A.publicB.static C.protectedD.private解析:解析 类的成员访问权限有 3种:public(公用)、protected(保护)、private(私有)。12.语句 ofstream f(“SALARY.DAT“,ios:appl ios:binary);的功能是建立流对象 f,试图打开文件SALARY.DAT并与之连接,并且 _ 。(分数:2.00)A.若文件存
39、在,将文件写指针定位于文件尾;若文件不存在,建立一个新文件 B.若文件存在,将其置为空文件;若文件不存在,打开失败C.若文件存在,将文件写指针定位于文件首;若文件不存在,建立一个新文件D.若文件存在,打开失败;若文件不存在,建立一个新文件解析:13.关于在调用模板函数时模板实参的使用,下列表述中正确的是_。(分数:2.50)A.对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略B.对于虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略C.对于虚拟类型参数所对应的模板实参,若能够省略则必须省略D.对于常规参数所对应的模板实参,任何
40、情况下都不能省略 解析:14.软件设计中划分模块的一个准则是_。(分数:2.50)A.低内聚低耦合B.高内聚低耦合 C.低内聚高耦合D.高内聚高耦合解析:解析 耦合性和内聚性是模块独立性的两个标准。在程序结构中,各模块的内聚性越强则耦合性就越弱。一般较为优秀的软件设计,应尽量做到高内聚、低耦合。15.下列 C+标点符号中表示一条语句结束的是_。(分数:2.50)A.#B.; C./D.解析:16.下列程序的运行结果是 #includeiostream.h class A int a; public: A( ) a0; A(int aa) aaa; cout a; ; void main( )
41、A x,y(2) ,z(3) ; cout endl; (分数:2.00)A.00B.23 C.34D.25解析:解析 本题考查的是对构造函数的掌握,另外“”运算符是右结合的,所以在进行输出的时候都是先把原来的输出后再自加 1。17.生成派生类对象时,派生类构造函数调用基类构造函数的条件是_。(分数:2.00)A.无需任何条件 B.基类中显式定义了构造函数C.派生类中显式定义了构造函数D.派生类构造函数明确调用了基类构造函数解析:18.下列关于顺序存储结构叙述中错误的是 _ 。(分数:2.00)A.存储密度大B.逻辑上相邻的结点物理上不必相邻 C.可以通过计算直接确定第 i个结点的存储地址D.
42、插入、删除运算操作不方便解析:19.有如下类定义: class B public: void fun1() private: void fun2() protected: void fun3() ; class D:public B protected: void fun4() ; 若 obj是类 D的对象,则下列语句中不违反访问控制权限的是_。(分数:1.00)A.obj.fun1(); B.obj.fun2();C.obj.fun3();D.obj.fun4();解析:解析 本题考查派生类对基类成员的访问属性,基类成员在派生类中的访问属性如下表所示,因此本题选 A, 基类中的属性 继承方式
43、 在派生类中的访问方式 公有成员 公有 保护成员 保护 私有成员 公有继承 不可直接访问 公有成员 保护 保护成员 保护 私有成员 保护继承 不可直接访问 公有成员 私有 保护成员 私有 私有成员 私有继承 不可直接访问 20.已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;,下列关于这个函数的叙述中,错误的是(分数:2.00)A.这是运算符一的重载运算符函数B.这个函数所重载的运算符是一个一元运算符 C.这是一个成员函数D.这个函数不改变类的任何数据成员的值解析:解析 二元运算符被重载为类的成员函数时,只需要定义一个参数,而另外一个参数为该对象自
44、身。21.下列字符串中不能作为 C+标识符使用的是_。(分数:2.00)A.DOUBLEB.abc C._5_D.xyz解析:22.下列关于运算符重载的描述中,正确的是_。(分数:1.00)A.运算符重载为成员函数时,若参数表中无参数,重载的是一元运算符 B.一元运算符只能作为成员函数重载C.二元运算符重载为非成员函数时,参数表中有一个参数D.C+中可以重载所有的运算符解析:解析 本题考查的知识点是运算符的重载。运算符重载为成员函数时,形参个数一般为运算符的元数减 1,因为此成员函数所属的对象可成为运算符的一个运算分量。重载为非成员函数时,形参个数一般和运算符元数相等。所以,二元运算符重载为非
45、成员函数时,参数表中应有两个参数,运算符重载为成员函数时,若参数表中无参数,重载的是一元运算符。一元运算符中,一取负运算符、+增 1运算符、-减 1等运算符均可重载为成员函数C+中,有.、.*、-*、:、?:五个运算符不能重载。23.下列叙述中正确的是_。(分数:1.00)A.软件测试应该由程序开发者来完成B.程序经调试后一般不需要再测试C.软件维护只包括对程序代码的维护D.以上三种说法都不对 解析:解析 程序调试就是诊断和改正程序中的错误,由程序开发者完成。软件测试是为了发现错误而执行程序的过程,它由专门的测试人员完成。软件维护是指软件系统交付使用以后,为了改正错误或满足新的需要而修改软件的过程,是软件生存周期中非常重要的一个阶段。24.下列程序的执行结果是_。 #includeiostream.
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1