1、二级 C+-100 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:46,分数:100.00)1.有如下程序 #includeiostream using namespace std; class Test public: Test() Test(const Test ; Test fun(Test return t; int main()Test x,y;x=fun(y);return 0; 运行这个程序的输出结果是_。(分数:2.00)A.无输出B.1C.11D.1112.若 MyClass 为一个类,执行“MyClass a4,*p5;”语句时会自动调用该类构造
2、函数的次数是_。(分数:2.00)A.2B.5C.4D.93.有如下程序: #includeiostream using namespace std; class CD public: CD()cout“C“;) private: char name80; ; int main()CD a,*b,d2;return 0; 运行时的输出结果是_。(分数:2.00)A.CCCCB.CCCC.CCD.C4.有如下程序: #includeiostream using namespace std; class XA int a; public: static int b; XA(int aa):a(aa
3、)b+; XA() int get()return a; ; int XA:b=0; int main() XA d1(2),d2(3); coutd1.get()+d2.get()+XA:bendl; return 0; 运行时的输出结果是_。(分数:2.00)A.5B.6C.7D.85.下列关于析构函数的描述中,错误的是_。(分数:2.00)A.析构函数可以重载B.析构函数由系统自动调用C.每个对象的析构函数只被调用一次D.每个类都有析构函数6.下列关于构造函数的描述中,错误的是_。(分数:2.00)A.构造函数名与类名相同B.构造函数可以有返回值C.构造函数可以重载D.每个类都有构造函数
4、7.若 PAT 是一个类,则程序运行时,语句“PAT*ad3;”调用 PAT 的构造函数的次数是_。(分数:2.00)A.0B.1C.2D.38.有如下程序: #includelostream using namespace std; class MyClass public: MyClass() cout “*“; MyClass(MyClass MyClass() cout “; ; int main(); MyClass a; Myclass b(a); return 0; 运行时的输出结果是_。(分数:2.00)A.*#B.#*C.*#D.#*9.有如下程序: #includeiost
5、ream using namespace std; class Monkey public: Monkey() cout“M“; Monkey(char n) coutn;) Monkey() cout“Y“; ; int main() Monkey p1,*p2; p2=new Monkey(“X“); delete p2; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.MYXB.MYMYC.MXYD.MXYY10.下列关于类成员对象构造函数调用顺序的叙述中,正确的是_。(分数:2.00)A.与它们在初始化列表中的顺序相同B.与它们在类中声明的顺序相同C.与析构函数的
6、调用顺序相同D.顺序不确定11.有如下程序: #includeiostream #includecstring using namespace std; class MyString public: char str80; MyString(const char*s)strcpy(str,s); MyString return*this; ; ostream int main() MyString x(“abc“),y(“cde“); cout(x+=y)endl; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.abcB.cdeC.abcdeD.abccde12.下列关
7、于 this 指针的叙述中,正确的是_。(分数:2.00)A.任何与类相关的函数都有 this 指针B.类的成员函数都有 this 指针C.类的友元函数都有 this 指针D.类的非静态成员函数才有 this 指针13.有如下头文件: int f1(); static int f2(); class MA public: int f3(); static int f4(); ; 在所描述的函数中,具有隐含的 this 指针的是_。(分数:2.00)A.f1B.f2C.f3D.f414.下列程序段中包含 4 个函数。其中具有隐含 this 指针的是_。 int fun1(); class Tes
8、t public: int fun2(); friend int fun3(); static int fun4(); (分数:2.00)A.fun1B.fnn2C.fun3D.fun415.下列关于 this 指针的描述中,正确的是_。(分数:2.00)A.类的成员函数都有 this 指针B.类的友元函数都有 this 指针C.任何与类相关的函数都有 this 指针D.类的非静态成员函数都有 this 指针16.有如下程序: #includeiostream using namespace std; class Test public: Test() n+=2; Test() n-=3; s
9、tatic int getNum()return n; private: static int n; ; int Test:n=1; int main() Test*p=new Test; delete p; cout“n=“Test:getNum()endl; return 0; 执行后的输出结果是_。(分数:2.00)A.n=0B.n=1C.n=2D.n=317.有如下程序: #includeiostream using namespace std; class Obj static int i; public: Obj()i+; Obj()i-; static int getVal()r
10、eturn i;) ; int Obj:i=0; void f()Obj ob2;coutob2.getVal(); int main() Obj ob1; f(); Obj*ob3=new Obj;coutob3-getVal(); delete ob3;coutObj:getVal(); return 0; 程序的输出结果是_。(分数:2.00)A.232B.231C.222D.22118.有如下程序: #includeiostream using namespace std; class MyClass public: MyClass()+count; MyClass()-count;
11、static int getCount()return count;) private: static int count; ; int MyClass:count=0; int main() MyClass obj; coutobj.getCount(); MyClass*ptr=new MyClass; coutMyClass:getCount(); delete ptr; coutMyClass:getCount(); return 0; 程序的输出结果是_。(分数:2.00)A.121B.232C.221D.12219.有如下类定义: class Point private; stat
12、ic int how_many; ; _how_many=0; 要初始化 Point 类的静态成员 how_many,下划线处应填入的内容是_。(分数:2.00)A.ingB.static intC.int Point:D.static int Point:20.有如下类和对象的定义: class Constants public; static double getPI()return 3.1416; ; Constants constants; 下列各组语句中,能输出 3.1416 的是_。(分数:2.00)A.coutconstants-getPI();和 coutConstants:g
13、erPI();B.coutconstants.getPI();和 coutConstants.getPI();C.coutconstants-getPI();和 coutConstants-getPI();D.coutconstants.getPI();和 coutConstants:getPI();21.若 AA 为一个类,a 为该类的非静态数据成员,在该类的一个成员函数定义中访问 a 时,其书写格式为_。(分数:2.00)A.aB.AA.aC.aD.AA:a22.有如下类定义: class Sample public; Sample(int x):ref(x) / private: Sam
14、ple():ref(0) / static int val=5; / constint ref; / ; 上述程序段中,错误的语句是_。(分数:2.00)A.B.C.D.23.己知类 Myclass 的定义如下 class MyClass public: void function1(MyClass static void function2(MyClass void function3()coutdata; staric void function4()coutdata; private: int data; ; 其中有编译错误的函数是_。(分数:2.00)A.function1B.func
15、tion2C.function3D.function424.有如下程序: #includeiostream using namespace std; class XA int a; public: static int b; XA(int aa):a(aa)b+; in getA()return a; ; int XA:b=0; int main() XA d1(4),d2(5); coutd1.getA()+d2.getA()+XA:b+d1.bendl; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.9B.11C.13D.1525.由于常对象不能被更新,因此_。(分
16、数:2.00)A.通过常对象只能调用它的常成员函数B.通过常对象只能调用静态成员函数C.常对象的成员都是常成员D.通过常对象可以调用任何不改变对象值的成员函数26.有如下程序 #includeiostream using namespace std; int i=1; class Fun public: static int i; int value()return i-1; int value()constreturn i+1;) ; int Fun:i=2; int main() int i=3; Fun fun1; const Fun fun2; _ return 0; 若程序的输出结果
17、是: 123 则程序中下划线处遗漏的语句是_。(分数:2.00)A.coutfun1.value()Fun:ifun2.value();B.coutFun:ifun1.value()fun2.value();C.coutfun1.value()fun2.value()Fun:i;D.coutfun2.value()Fun:ifun1.value();27.有如下程序: #includeiostream using namespace std; class VAC public; int f() constreturn 3; int f()return 5; ; Int main() VAC v
18、1; const VAC v2; coutv1.f()v2.f(); return 0; 运行时的输出结果是_。(分数:2.00)A.53B.35C.55D.3328.有如下程序: #includeiostream using namespace std; class MyClass public: MyClass(int x):val(X) void Set(int X)val=x; void Print()constcout“val=“val“/t“; private: int val; ; int main() const MyClass obj1(10); MyClass obj2(2
19、0); obj1.Print(); /语句 1 obj2.Print(); /语句 2 obj1.Set(20); /语句 3 obj2.Set(30); /语句 4 return 0; 其主函数中错误的语句是_。(分数:2.00)A.语句 1B.语句 2C.语句 3D.语句 429.有如下类定义和变量定义: classA public: A()data=0; A() int GetData() const return data; void SetData(int n) data=n; private: int data; ; constA a; A b; 下列函数调用中错误的是_。(分数:
20、2.00)A.a.GetData();B.a.SetData(10);C.b.GetData();D.b.SetData(10);30.有如下程序: #includeiostream using namespace std; class A public: A(int i):r1(i) void print() cout“E“r1“-“; void print() const cout“C“r1*r1“-“; private: int r1; ; int main() A a1(2); const A a2(4); a1.print(); a2.print(); return 0; 运行时的输
21、出结果是_。(分数:2.00)A.运行时出错B.E2-C16-C.C4-C16-D.E2-E4-31.有如下程序: #includeiostream using namespace std; class A public: A(int i=0):r1(i) void print()cout“E“r1“-“; void print()constcout“C“r1*r1“-“; void print(int x)cout“p“r1*r1*r1“-“; private: int r1; ; int main() A a1; const A a2(4); a1.print(2); a2.print()
22、; return 0; 运行时的输出结果是_。(分数:2.00)A.P8-E4B.P8-C16-C.P0-E4-D.P0-C16-32.某类中有一个无参且无返回值的常成员函数 Show,则正确的 Show 函数原型是_。(分数:2.00)A.const void Show();B.void const Show();C.void Show() const;D.void Show(const);33.已知类 IMS 中两个成员函数的声明为“void listen()const;”与“void speak();”,另有两个对象的定义为“IMS obj1;”与“const IMS obj2;”,则下
23、列语句中,产生编译错误的是_。(分数:2.00)A.obj1.listen();B.obj1.speak();C.obj2.listen();D.obj2.speak();34.己知函数 print()没有返回值,如果在类中将之声明为常成员函数,正确的是_。(分数:2.00)A.void print() const;B.const void print();C.void const print();D.void print(const);35.有如下类定义: class Test char a;const char b; public: Test(char c)a=c;b=c; /第 1 行
24、void f(char a)constthis-a=a;) /第 2 行 void g(char b)this-b=b;) /第 3 行 char h()constreturn a;) /第 4 行 ; 编译时没有错误的行是_。(分数:2.00)A.第 1 行B.第 2 行C.第 3 行D.第 4 行36.有如下类定义: class AA int a; public: int getRef()constreturn / int getValue()constreturn a; / void set(int n)consta=n; / friend void show(AA aa)constco
25、uta;) / ; 其中的四个函数定义中正确的是_。(分数:2.00)A.B.C.D.37.有如下程序: #includeiostream using namespace std; class Sample friend long fun(Sample s); public: Sample(long a)x=a; private: long x; ; long fun(Sample s) if(s.x2)return 1: return s.x*fun(Sample(s.x-1): int main() int sum=0; for(int i=0;i6;i+)sum+=fun(Sample(
26、i); coutsum; return 0; 运行时输出的结果是_。(分数:2.00)A.120B.16C.154D.3438.有如下程序: #includeiostream #includecmath using std:cout; class Point public: friend double distance(const Point /p 距原点的距离 Point(int xx=0,int yy=0):x(xx),y(yy) / private: int x,y; ; double distance(const Point int main() Point p1(3,4); cout
27、distance(p1); / return 0; 下列叙述中正确的是_。(分数:2.00)A.程序编译正确B.程序编译时语句出错C.程序编译时语句出错D.程序编译时语句出错39.有如下程序: #includeiostream using namespace std; class Boat; class Car public: Car(int i):weight(i) friend int Total(const Car / private: int weight; ; class Boat public: Boat(int i):weight(i) friend int Total(cons
28、t 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; 下列关于程序的描述中,正确的是_。(分数:3.00)A.程序编译正确B.程序编译时语句出错C.程序编译时语句出错D.程序编译时语句出错40.己知类 MyClass 声明如下: class MyClass int n; public: MyClass(int k):n(k) int getValue()const return n
29、; ; 在下列数组定义中正确的是_。(分数:3.00)A.MyClass x12;B.MyClass x22=new MyClass(1),new MyClass(2);C.MyClass *x32;D.MyClass *x42=MyClass(1),MyClass(2);41.己知类 Myclass 的定义如下: class MyClass public: MyClass(int d)data=d; MyClass() private: int data; ; 下列对 Myclass 类对象数组的定义和初始化语句中,正确的是_。(分数:3.00)A.MyClass arrays2;B.MyC
30、lass arrays2=MyClass(5);C.MyClass arrays2=MyClass(5),MyClass(6);D.MyClass* arrays=new MyClass2;42.有如下类声明: class XA inl x; public: XA(int n)x=n; ; class XB:public XA int y; public: XB(int a,int b); ; 在构造函数 XB 的下列定义中,正确的是_。(分数:3.00)A.XB:XB(int a,int b):x(a),y(b)B.XB:XB(int a,int b):XA(a),y(b)C.XB:XB(i
31、nt a,int b):x(a),XB(b)D.XB:XB(int a,int b):XA(a),XB(b)43.有如下程序: #includeiostream using namespace std; class BASE public: BASE()cout“BASE“; ; class DERIVED:public BASE public: DERIVED()cout“DERIVED“; ; int main()DERIVED x;return 0; 执行后的输出结果是_。(分数:3.00)A.BASEB.DERJVEDC.BASEDERIVEDD.DERIVEDBASE44.下列有关继
32、承和派生的叙述中,正确的是_。(分数:3.00)A.如果一个派生类私有继承其基类,则该派生类对象不能访问基类的保护成员B.派生类的成员函数可以访问基类的所有成员C.基类对象可以赋值给派生类对象D.如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类45.下列有关类继承的叙述中,错误的是_。(分数:3.00)A.继承可以实现软件复用B.虚基类可以解决由多继承产生的二义性问题C.派生类构造函数要负责调用基类的构造函数D.派生类没有继承基类的私有成员46.在下列关键字中,不能用来表示继承方式的是_。(分数:3.00)A.privateB.staticC.publicD.protected二级
33、 C+-100 答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:46,分数:100.00)1.有如下程序 #includeiostream using namespace std; class Test public: Test() Test(const Test ; Test fun(Test return t; int main()Test x,y;x=fun(y);return 0; 运行这个程序的输出结果是_。(分数:2.00)A.无输出B.1C.11 D.111解析:解析 在类 Test 中定义拷贝构造函数 Test(constTest”语句时会自动调用该类构
34、造函数的次数是_。(分数:2.00)A.2B.5C.4 D.9解析:解析 语句 MyClass a4,*p5不仅定义了 4 个 MyClass 对象,分别为 a0,a1,a2,a3,而且定义了 5 个指向 MyClass 对象的指针变量,分别为*p0,*p1,*p2,*p3,*p4,所以共调用MyClass 的构造函数 4 次。3.有如下程序: #includeiostream using namespace std; class CD public: CD()cout“C“;) private: char name80; ; int main()CD a,*b,d2;return 0; 运行
35、时的输出结果是_。(分数:2.00)A.CCCCB.CCC C.CCD.C解析:解析 在这个程序的主函数中定义了 3 个 CD 类的实例对象 a,d0,d1和一个指向 CD 类对象的指针变量 b,所以当程序结束时,执行 CD 的析构函数输出字符 C 三次。4.有如下程序: #includeiostream using namespace std; class XA int a; public: static int b; XA(int aa):a(aa)b+; XA() int get()return a; ; int XA:b=0; int main() XA d1(2),d2(3); co
36、utd1.get()+d2.get()+XA:bendl; return 0; 运行时的输出结果是_。(分数:2.00)A.5B.6C.7 D.8解析:解析 执行 XA 类的实例变量 d1(2)时,成员函数 d1.get()的返回值等于 2,XA.b 的值等于 1,执行 XA 类的实例变量 d2(3)时,成员函数 d1.get()的返回值等于 3,XA.b 的值等于 2,所以输出结果为2+3+2=7。5.下列关于析构函数的描述中,错误的是_。(分数:2.00)A.析构函数可以重载 B.析构函数由系统自动调用C.每个对象的析构函数只被调用一次D.每个类都有析构函数解析:解析 一般情况下,析构函数
37、在对象的生存周期即将结束的时候由系统自动调用。在调用完成之后,对象也就消失了,相应的内存空间也被释放。析构函数没有参数,因此析构函数不能重载,一个类中只能定义一个析构函数。6.下列关于构造函数的描述中,错误的是_。(分数:2.00)A.构造函数名与类名相同B.构造函数可以有返回值 C.构造函数可以重载D.每个类都有构造函数解析:解析 构造函数具有下面 4 个特殊的性质:构造函数的名字必须与类名相同;构造函数不指定返回类型,它隐含有返回值,由系统内部使用;构造函数可以有一个或多个参数,因此构造函数可以重载:在创建对象时,系统会自动调用构造函数。7.若 PAT 是一个类,则程序运行时,语句“PAT
38、*ad3;”调用 PAT 的构造函数的次数是_。(分数:2.00)A.0 B.1C.2D.3解析:解析 语句“PAT(*ad)3”定义了含有 3 个元素的指向类 PAT 类型的指针数组 ad。8.有如下程序: #includelostream using namespace std; class MyClass public: MyClass() cout “*“; MyClass(MyClass MyClass() cout “; ; int main(); MyClass a; Myclass b(a); return 0; 运行时的输出结果是_。(分数:2.00)A.*#B.#*C.*#
39、 D.#*解析:解析 程序在执行时,先创建类对象 a,输出*,再创建类对象 b,输出#,然后再依次调用类对象b 和 a 的析构函数,输出两个。9.有如下程序: #includeiostream using namespace std; class Monkey public: Monkey() cout“M“; Monkey(char n) coutn;) Monkey() cout“Y“; ; int main() Monkey p1,*p2; p2=new Monkey(“X“); delete p2; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.MYXB.MYM
40、YC.MXYD.MXYY 解析:解析 在类 Monkey 中定义了默认的构造函数和带参数的构造函数,所以在主函数中,定义Monkey 的对象 p1 时,调用默认的构造函数,输出 M;定义 Monkey 的对象 p2 时,调用带参数的构造函数,输出 X;在执行“delete p2;”语句时,调用析构函数,输出 Y,在退出程序时,调用析构函数输出 Y。10.下列关于类成员对象构造函数调用顺序的叙述中,正确的是_。(分数:2.00)A.与它们在初始化列表中的顺序相同B.与它们在类中声明的顺序相同 C.与析构函数的调用顺序相同D.顺序不确定解析:解析 类成员对象构造函数的调用是按照在类中定义的顺序进行
41、的,而不是按照构造函数说明后的冒号顺序进行构造的。11.有如下程序: #includeiostream #includecstring using namespace std; class MyString public: char str80; MyString(const char*s)strcpy(str,s); MyString return*this; ; ostream int main() MyString x(“abc“),y(“cde“); cout(x+=y)endl; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.abcB.cdeC.abcdeD.
42、abccde 解析:解析 在类 MyString 中,定义了带参数的构造函数 MyString(const char*s),其作用是把 s 指向的字符串拷贝到字符组 str 中。在类中还对运算+=进行重载定义,其作用是把字符串 str 和 a 相连接并赋给 str,所以在主函数中执行 x+=y 时,结果为 abccde。12.下列关于 this 指针的叙述中,正确的是_。(分数:2.00)A.任何与类相关的函数都有 this 指针B.类的成员函数都有 this 指针C.类的友元函数都有 this 指针D.类的非静态成员函数才有 this 指针 解析:解析 此题考查的是 this 指针的使用。类
43、的每一个成员函数都有一个隐含的常量指针,即 this指针。类的静态成员函数不能含有 this 指针,因为 this 指针是一个指向本对象的指针。13.有如下头文件: int f1(); static int f2(); class MA public: int f3(); static int f4(); ; 在所描述的函数中,具有隐含的 this 指针的是_。(分数:2.00)A.f1B.f2C.f3 D.f4解析:解析 此题考查的是 this 指针。this 指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确地表示出了成员函数当前操作的数据所属的对象。题目中,只有 f3()满足
44、“类的非静态成员函数”的要求,故应选 C 选项。14.下列程序段中包含 4 个函数。其中具有隐含 this 指针的是_。 int fun1(); class Test public: int fun2(); friend int fun3(); static int fun4(); (分数:2.00)A.fun1B.fnn2 C.fun3D.fun4解析:解析 this 指针是成员函数所属对象的指针,它指向类对象的地址。成员函数通过这个指针知道自己属于哪一个对象。this 指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确的地表示出了成员函数当前操作的数据所属的对象。15.下列关于
45、 this 指针的描述中,正确的是_。(分数:2.00)A.类的成员函数都有 this 指针B.类的友元函数都有 this 指针C.任何与类相关的函数都有 this 指针D.类的非静态成员函数都有 this 指针 解析:解析 this 是成员函数所属对象的指针,它指向类对象的地址。成员函数通过这个指针可以知道自己属于哪一个对象。它隐藏于每个类的非静态成员函数中。16.有如下程序: #includeiostream using namespace std; class Test public: Test() n+=2; Test() n-=3; static int getNum()return
46、 n; private: static int n; ; int Test:n=1; int main() Test*p=new Test; delete p; cout“n=“Test:getNum()endl; return 0; 执行后的输出结果是_。(分数:2.00)A.n=0 B.n=1C.n=2D.n=3解析:解析 此题考查的是静态数据成员和静态成员函数。静态数据成员是类中所有对象共享的成员,而不是某个对象的成员。题目中的静态数据成员 n 的运算具有叠加性,执行“n+=2”和“n-=3”后 n 的值为 0。17.有如下程序: #includeiostream using namespace std; class Obj static in