1、二级 C+-111 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:46,分数:100.00)1.在类声明中,紧跟在“public:”后声明的成员的访问权限是_。(分数:2.00)A.私有B.公有C.保护D.默认2.定义派生类时,若不使用关键字显式地规定采用何种继承方式,则默认方式为_。(分数:2.00)A.私有继承B.非私有继承C.保护继承D.公有继承3.有如下类定义: class XX int xx; public: XX():xx(0)cout“A“;) XX(int n):xx(n)cout“B“; ; class YY:public XX int yy; p
2、ublic: YY():yy(0)coutyy; YY(int n):XX(n+1),yy(n)coutyy; YY(int m,int n):XX(m),yy(n)coutyy; ; 下列选项中,输出结果为 AO 的语句是_。(分数:2.00)A.YY y1(0,0);B.YY y2(1);C.YY y3(0);D.YY y4;4.有如下类定义: class XX int xdata; public: XX(int n=0):xdata(n) ; class YY:public XX int ydata; public: YY(int m=0,int n=0):XX(m),ydata(n)
3、; YY 类的对象包含的数据成员的个数是_。(分数:2.00)A.1B.2C.3D.45.下列关于继承方式的描述中,错误的是_。(分数:2.00)A.如果不显式地指定继承方式,缺省的继承方式是私有(private)B.采用公有继承方式时,基类中的公有成员在派生类中仍然是公有成员C.采用保护继承方式时,基类中的保护成员在派生类中仍然是保护成员D.采用私有继承方式时,基类中的私有成员在派生类中仍然是私有成员6.下列代码段声明了 3 个类 class Person; class Student:public Person; class Undergraduate:Student; 下列关于这些类之间
4、关系的描述中,错误的是_。(分数:2.00)A.类 Person 是类 Undergraduate 的基类B.类 Undergraduate 从类 student 公有继承C.类 student 是类 Person 的派生类D.类 Undergraduate 是类 Person 的派生类7.下列关于基类和派生类关系的叙述中,正确的是_。(分数:2.00)A.每个类最多只能有一个直接基类B.派生类中的成员可以访问基类中的任何成员C.基类的构造函数必须在派生类的构造函数体中调用D.派生类除了继承基类的成员,还可以定义新的成员8.若已定义了类 Vehicle,则下列派生类定义中,错误的是_。(分数:
5、2.00)A.class Car:vehicle/*类体略*/;B.class Car:public car/*类体略*/;C.class Car:public Vehicle/*类体略*/);D.class Car:virtual public Vehicle/*类体略*/;9.下列描述中,错误的是_。(分数:2.00)A.公有继承时基类中的公有成员在派生类中仍是公有成员B.公有继承时基类中的保护成员在派生类中仍是保护成员C.保护继承时基类中的公有成员在派生类中仍是公有成员D.保护继承时基类中的保护成员在派生类中仍是保护成员10.当派生类继承一个基类时,默认的继承方式为_。(分数:2.00)
6、A.publicB.protectedC.privateD.不确定11.下列关于派生类的叙述中,错误的是_。(分数:2.00)A.派生类至少要有一个基类B.派生类中包括了从基类继承的成员C.一个派生类可以作为另一个派生类的基类D.基类成员被派生类继承以后访问权限保持不变12.有如下类声明: class MyBASE int k; public: void set(int n)k=n; int get()constreturn k; ; class MyDERIVED:protected MyBASE protected: int j; public: void set(int m,int n)
7、MyBASE:set(m);j=n; int get()constreturn MyBASE:get()+j; ; 则类 MyDERIVED 中保护的数据成员和成员函数的个数是_。(分数:2.00)A.4B.3C.2D.113.有如下程序: #includeiostream using namespace std; class Base public: void fun()cout“Base:fun“endl; ; class Derived:public Base public: void fun() _ cout“Derived:fun“endl; ; int main() Derived
8、 d; d.fun(); return 0; 已知其执行后的输出结果为: Base:fun Derived:fun 则程序中下划线处应填入的语句是_。(分数:2.00)A.Base.fun();B.Base:fun();C.Base-fun();D.fun();14.有如下程序: #includeiostream using namespace std; class Base private: void fun1() constcout“fun1“; protected: void fun2() constcout“fun2“; public: void fun3() constcout“fu
9、n3“; ; class Derived:protected Base public: void fun4() constcout“fun4“; ; int main() Derived obj; obj.fun1(); / obj.fun2(); / obj.fun3(); / obj.fun4(); / return 0; 其中有语法错误的语句是_。(分数:2.00)A.B.C.D.15.在公有继承的情况下,允许派生类直接访问的基类成员包括_。(分数:2.00)A.公有成员B.公有成员和保护成员C.公有成员、保护成员和私有成员D.保护成员16.有如下类定义: class MyBase in
10、t k; public: MyBase(int n=0):k(n) int value()constreturn k; ; class MyDerived:MyBase int j; public: MyDerived(int i):j(i) int getK()constreturn k; int getJ()constreturn j; ; 编译时发现有一处语法错误,对这个错误最准确的描述是_。(分数:2.00)A.函数 getK 试图访问基类的私有成员变量 kB.在类 MyDerived 的定义中,基类名 MyBase 前缺少关键字 public、protected 或 privateC
11、.类 MyDerived 缺少一个无参的构造函数D.类 MyDerived 的构造函数没有对基类数据成员 k 进行初始化17.派生类的成员函数不能访问基类的_。(分数:2.00)A.公有成员和保护成员B.公有成员C.私有成员D.保护成员18.若有如下类定义: classB void fun1() protected: double var1; public: void fun2() ; class D:public B protected: void fun3() ; 己知 obj 是类 D 的对象,下列句中不违反类成员访问控制权限的是_。(分数:2.00)A.obj.fun1();B.obj
12、.var1;C.obj.fun2();D.obj.fun3();19.有如下类声明: class Base protected; int amount; public; Base(int n=0):amount(n) int getAmount()constreturn amount; ; class Derived:public Base protected; int value; public; Derived(int m,int n):value(m).Base(n) Int getData()constreturn value+amount; ; 己知 x 是一个 Derived 对象
13、,则下列表达式中正确的是_。(分数:2.00)A.value+x.getAmount()B.getData()-x.gctAmount()C.getData()-x.amountD.value+x.amount20.在一个派生类的成员函数中,试图调用其基类的成员函数“void f();”,但无法通过编译。这说明_。(分数:2.00)A.f()是基类的私有成员B.f()是基类的保护成员C.派生类的继承方式为私有D.派生类的继承方式为保护21.对于通过公有继承定义的派生类,若其成员函数可以直接访问基类的某个成员,说明该基类成员的访问权限是_。(分数:2.00)A.公有或私有B.私有C.保护或私有D
14、.公有或保护22.建立一个有成员对象的派生类对象时,各构造函数体的执行次序为_。(分数:2.00)A.派生类、成员对象类、基类B.成员对象类、基类、派生类C.基类、成员对象类、派生类D.基类、派生类、成员对象类23.有如下类定义和变量定义: class Parents public: int publicData; private: int privateData; ; class ChildA:public Parents/*类体略*/; class ChildB:private Parents/*类体略*/; ChildA a; ChildB b; 下列语句中正确的是_。(分数:2.00)
15、A.couta.publicDataendl;B.couta.privateDataendl;C.coutb.publicDataendl;D.coutb.privateDataendl;24.通过派生类的对象可直接访问其_。(分数:2.00)A.公有继承基类的公有成员B.公有继承基类韵私有成员C.私有继承基类的公有成员D.私有继承基类的私有成员25.有如下程序: #includeiostream using namespace std; classAA int k; protected: int n; void setK(int k)this-k=k; public: void setN(i
16、nt n)this-n=n; ; class BB:public AA/*类体略*/; intmain() BB x; x.n=1; /1 x.setN(2); /2 x.k=3; /3 x.setK(4); /4 return 0; 在标注号码的四条语句中正确的是_。(分数:2.00)A.1B.2C.3D.426.有如下两个类定义 class XX private: double x1; protected: double x2; public: double x3; ; class YY:protected XX private: double y1; potected: double y
17、2; punic: double y3; ; 在类 YY 中保护成员变量的个数是_。(分数:2.00)A.1B.2C.3D.427.有如下程序: #includeiostream using namespace std; class Music public: void setTitle(char* str)strcpy(title,str); protected: char type10; private: char title20; ; class Jazz:public Music public: void set(char* str) strcpy(type,“Jazz“); / st
18、rcpy(title,str); / ; 下列叙述中正确的是_。(分数:2.00)A.程序编译正确B.程序编译时语句出错C.程序编译时语句出错D.程序编译时语句和都出错28.当派生类从一个基类保护继承时,基类中的一些成员在派生类中成为保护成员,这些成员在基类中原有的访问属性是_。(分数:2.00)A.任何B.公有或保护C.保护或私有D.私有29.下列关于派生类和基类的描述中,正确的是_。(分数:2.00)A.派生类成员函数只能访问基类的公有成员B.派生类成员函数只能访问基类的公有和保护成员C.派生类成员函数可以访问基类的所有成员D.派生类对基类的默认继承方式是公有继承30.有如下类定义: cl
19、ass B public:void fun1() private:void fun2() protected:void fun3() ; class D:public B protected:void fun4() ; 若 obj 是类 D 的对象,则下列语句中不违反访问控制权限的是_。(分数:2.00)A.obj.fun1();B.obj.fun2();C.obj.fun3();D.obj.fun4();31.有如下程序: classBase public: int data: ; class Derived1:public Base; class Derived2:protected Ba
20、se; int main() Derived1 d1; Derived2 d2; d1.data=0; / d2.data=0; / return 0; 下列关于程序编译结果的描述中,正确的是_。(分数:2.00)A.皆无编译错误B.有编译错误,无编译错误C.无编译错误,有编译错误D.皆有编译错误32.有如下程序: #includeiostream using namespace std; class XX int x; public: XX(int XX=0):x(xx) int getX()return x; ; class YY:public XX int y; public: YY(i
21、nt xx,int yy):XX(xx),y(yy) int getV()return getX()+y; ; int main() YY c(3,4); coutc.getV()+c.getX()endl; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.3B.4C.7D.1033.有如下程序: #includeiostream using namespace std; class Media public: void Name(); void Show(); protected: int page; ; class Book:private Media public:
22、 void Print() coutpageendl; void Show()Media:Show();) / ; int main() Book Bible; Bible.Name(); / Bible.Print(); / Bible.Show(); / return 0; 编译时有错误的是_。(分数:2.00)A.语句B.语句C.语句D.语句34.有如下程序: #includeiostream using namespace std; class A public: A()cout“A“; ; classBpublic:B()cout“B“; classC:public A B b; p
23、ublic: C()cout“C“; ; int main() C obj;return 0; 执行后的输出结果是_。(分数:2.00)A.CBAB.BACC.ACBD.ABC35.有如下程序: #includeiostream using namespace std; class A public: A()cout“A“; A()cout“A“; ; class B:public A A* p; public: B()cout“B“;p=new A(); B()cout“B“;delete p; ; int main() B obj; return 0; 执行这个程序的输出结果是_。(分数:
24、2.00)A.BAAABAB.ABABAAC.BAABAAD.ABAABA36.有如下程序 #includeiostream using namespace std; 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; 执行这个程序屏幕上将显示输出_。(分数:2.00)ABB.BAC.ABD.BB37.在一个派生类对象结束其生命周期时_。(分
25、数:2.00)A.先调用派生类的析构函数后调用基类的析构函数B.先调用基类的析构函数后调用派生类的析构函数C.如果基类没有定义析构函数,则只调用派生类的析构函数D.如果派生类没有定义析构函数,则只调用基类的析构函数38.下列关于派生类构造函数和析构函数的说法中,错误的是_。(分数:2.00)A.派生类的构造函数会隐含调用基类的构造函数B.如果基类中没有缺省构造函数,那么派生类必须定义构造函数C.在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数D.在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数39.下列有关继承和派生的叙述中,正确的是_。(分数:3.00)A.派
26、生类不能访问基类的保护成员B.作为虚基类的类不能被实例化C.派生类应当向基类的构造函数传递参数D.虚函数必须在派生类中重新实现40.有如下程序: #includeiostream using namespace std; class A public: A(int i)x=i; void dispa()coutx“,“; private: int x; ; class B:public A public: B(int i):A(i+10)x=i; void dispb()dispa();coutxendl; private int x; ; int main() B b(2); b.dispb
27、(); return 0; 运行时输出的结果是_。(分数:3.00)A.10,2B.12,10C.12,2D.2,241.有如下程序: #includeiostream using namespace std; class Base int x; public; Baseint n=0;x(n)coutn; Int getX()constreturn x;) ; class Derived public Base int y; public; Derived(int m,int n):y(m),Base(n)coutm; Derived(int m):y(m)coutm; ; int main
28、() Derived d1(3),d2(5,7); Return 0; 运行时的输出结果是_。(分数:3.00)A.375B.357C.0375D.035742.有如下程序: #includeiostream using namespace std; class AA public: AA()cout“1“; ; class BB:public AA int k; public: BB():k(0) cout“2“; BB(int n):k(n) cout“3“; ; int main() BB b(4),c; return 0; 运行时的输出结果是_。(分数:3.00)A.1312B.132
29、C.32D.141243.有如下程序: #includeiostream using namespace std; class C1 public: C1()cout1; ; class C2:public C1 public: C2()cout2; ; int main() C2 cb2; C1 *cb1; return 0; 运行时的输出结果是_。(分数:3.00)A.121B.21C.211D.1244.有如下程序: #includeiostream using namespace std; class Base public: Base(int x=0):valB(x)coutvalB
30、; Base()coutvalB; private: int valB; ; class Derived:public Base public: Derived(int x=0,int y=0):Base(x),valD(y)coutvalD; Derived()coutvalD; private: int valD; ; int main() Derived obj12(2,3); return 0; 运行时的输出结果是_。(分数:3.00)A.2332B.2323C.3232D.322345.生成派生类对象时,派生类构造函数调用基类构造函数的条件是_。(分数:3.00)A.无需任何条件B.
31、基类中显示定义了构造函数C.派生类中显式定义了构造函数D.派生类构造函数明确调用了基类构造函数46.有如下类定义: class AA int a; public: AA(int n=0):a(n) ; class BB:public AA public: BB(int n)_ ; 其中横线处缺失部分是_。(分数:3.00)A.:a(n)B.:AA(n)C.a(n);D.a=n;二级 C+-111 答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:46,分数:100.00)1.在类声明中,紧跟在“public:”后声明的成员的访问权限是_。(分数:2.00)A.私有B.公有
32、 C.保护D.默认解析:解析 类中提供了 3 种访问控制的权限:公有,私有和保护。其中公有类型定义了类的外部接口,任何一个外部的访问都必须通过外部接口进行。私有类型的成员只允许本类的成员函数访问,来自类外部的任何访问都是非法的,保护类型介于公有类型和私有类型之间,在继承和派生时可以体现出其特点。2.定义派生类时,若不使用关键字显式地规定采用何种继承方式,则默认方式为_。(分数:2.00)A.私有继承 B.非私有继承C.保护继承D.公有继承解析:解析 继承的方式包括三种:公有继承,保护继承和私有继承。如果不显示的给出继承方式,缺省的类继承方式是私有继承 private。3.有如下类定义: cla
33、ss XX int xx; public: XX():xx(0)cout“A“;) XX(int n):xx(n)cout“B“; ; class YY:public XX int yy; public: YY():yy(0)coutyy; YY(int n):XX(n+1),yy(n)coutyy; YY(int m,int n):XX(m),yy(n)coutyy; ; 下列选项中,输出结果为 AO 的语句是_。(分数:2.00)A.YY y1(0,0);B.YY y2(1);C.YY y3(0);D.YY y4; 解析:解析 考查的是类的继承。选项 A 的执行结果为 B0,建立 YY 的
34、对象 v1,首先调用其构造函数,YY 继承于 XX 所以先调用的为 XX 的构造函数,根据输入的参数可知输出 B,然后执行 YY 的构造函数输出0;同理,选项 B 的执行结果为 B1,选项 C 的执行结果为 B0。4.有如下类定义: class XX int xdata; public: XX(int n=0):xdata(n) ; class YY:public XX int ydata; public: YY(int m=0,int n=0):XX(m),ydata(n) ; YY 类的对象包含的数据成员的个数是_。(分数:2.00)A.1B.2 C.3D.4解析:解析 因为类 XX 包括
35、一个数据成员 xdata,而类 YY 继承自类 XX,所在类 YY 中也包含数据成员xdata,同时类 YY 中也定义了其本身的数据成员 ydata,因而 YY 类的对象包含的数据成员的个数是 2。5.下列关于继承方式的描述中,错误的是_。(分数:2.00)A.如果不显式地指定继承方式,缺省的继承方式是私有(private)B.采用公有继承方式时,基类中的公有成员在派生类中仍然是公有成员C.采用保护继承方式时,基类中的保护成员在派生类中仍然是保护成员D.采用私有继承方式时,基类中的私有成员在派生类中仍然是私有成员 解析:解析 基类中的私有成员在派生类中是隐蔽的,只能在基类内部访问。派生类中的成
36、员不可以访问基类中的私有成员,只可以访问基类中的公有成员和保护成员。6.下列代码段声明了 3 个类 class Person; class Student:public Person; class Undergraduate:Student; 下列关于这些类之间关系的描述中,错误的是_。(分数:2.00)A.类 Person 是类 Undergraduate 的基类B.类 Undergraduate 从类 student 公有继承 C.类 student 是类 Person 的派生类D.类 Undergraduate 是类 Person 的派生类解析:解析 Student 类公有继承自 Per
37、son 类,Undergraduate 类私有继承自 Student 类。所以Undergraduate 类是从 Student 类私有继承的。7.下列关于基类和派生类关系的叙述中,正确的是_。(分数:2.00)A.每个类最多只能有一个直接基类B.派生类中的成员可以访问基类中的任何成员C.基类的构造函数必须在派生类的构造函数体中调用D.派生类除了继承基类的成员,还可以定义新的成员 解析:解析 继承分为单继承和多继承,一个类只有一个直接基类时,称为单继承;而一个类同时有多个直接基类时,则称为多继承。派生类的数据成员由所有基类的的数据成员与派生类新增的数据成员共同组成。8.若已定义了类 Vehic
38、le,则下列派生类定义中,错误的是_。(分数:2.00)A.class Car:vehicle/*类体略*/;B.class Car:public car/*类体略*/; C.class Car:public Vehicle/*类体略*/);D.class Car:virtual public Vehicle/*类体略*/;解析:解析 类 Car 不能派生自它本身。9.下列描述中,错误的是_。(分数:2.00)A.公有继承时基类中的公有成员在派生类中仍是公有成员B.公有继承时基类中的保护成员在派生类中仍是保护成员C.保护继承时基类中的公有成员在派生类中仍是公有成员 D.保护继承时基类中的保护成
39、员在派生类中仍是保护成员解析:解析 保护继承时基类中的公有成员在派生类中是保护成员。10.当派生类继承一个基类时,默认的继承方式为_。(分数:2.00)A.publicB.protectedC.private D.不确定解析:解析 派生类继承一个基类时,默认的继承方式为 private。11.下列关于派生类的叙述中,错误的是_。(分数:2.00)A.派生类至少要有一个基类B.派生类中包括了从基类继承的成员C.一个派生类可以作为另一个派生类的基类D.基类成员被派生类继承以后访问权限保持不变 解析:解析 派生类对象对基类成员的访问权限:对于公有继承,只有基类的公有成员可以被派生类对象访问,其他(保
40、护和私有)成员不能被访问。对于私有继承和保护继承,基类中所有成员都不能被派生类对象访问。派生类对基类成员的访问权限:对于公有继承,基类中公有成员和保护成员可以访问,而基类中私有成员不能被访问。对于私有继承和保护继承,也是基类中的公有成员和保护成员可以被派生类访问,而基类中的私有成员不能被访问。12.有如下类声明: class MyBASE int k; public: void set(int n)k=n; int get()constreturn k; ; class MyDERIVED:protected MyBASE protected: int j; public: void set(
41、int m,int n)MyBASE:set(m);j=n; int get()constreturn MyBASE:get()+j; ; 则类 MyDERIVED 中保护的数据成员和成员函数的个数是_。(分数:2.00)A.4B.3 C.2D.1解析:解析 此题考查的是派生与继承中的访问权限。protected 派生:private-不可见;protected-private;public-protected。13.有如下程序: #includeiostream using namespace std; class Base public: void fun()cout“Base:fun“e
42、ndl; ; class Derived:public Base public: void fun() _ cout“Derived:fun“endl; ; int main() Derived d; d.fun(); return 0; 已知其执行后的输出结果为: Base:fun Derived:fun 则程序中下划线处应填入的语句是_。(分数:2.00)A.Base.fun();B.Base:fun(); C.Base-fun();D.fun();解析:解析 此题考查的是继承的使用。分析题目可知,横线处应填入对基类成员函数 fun()的调用语句,此处只能使用作用域运算符“:”才能调用到基
43、类的同名函数,故选项 B 正确。14.有如下程序: #includeiostream using namespace std; class Base private: void fun1() constcout“fun1“; protected: void fun2() constcout“fun2“; public: void fun3() constcout“fun3“; ; class Derived:protected Base public: void fun4() constcout“fun4“; ; int main() Derived obj; obj.fun1(); / ob
44、j.fun2(); / obj.fun3(); / obj.fun4(); / return 0; 其中有语法错误的语句是_。(分数:2.00)A.B. C.D.解析:解析 此题考查的是保护继承。因为 Derived 以 protected 方式继承了 Base 类,所以父类 Base中的公有成员和保护成员均成了 Derived 类的保护成员,而 Base 类的私有成员 Derived 类不可访问。所以,主函数中通过 Derived 类的对象只能够访问到 Derived 类的公有成员。15.在公有继承的情况下,允许派生类直接访问的基类成员包括_。(分数:2.00)A.公有成员B.公有成员和保护
45、成员 C.公有成员、保护成员和私有成员D.保护成员解析:解析 此题考查的是派生类对基类成员的访问。基类的成员有公有、保护和私有三种访问属性;类的继承方式也有公有继承、保护继承和私有继承三种。无论那种继承方式,派生类中的成员都不能访问基类中的私有成员,但可以访问基类中的公有成员和保护成员。16.有如下类定义: class MyBase int k; public: MyBase(int n=0):k(n) int value()constreturn k; ; class MyDerived:MyBase int j; public: MyDerived(int i):j(i) int getK
46、()constreturn k; int getJ()constreturn j; ; 编译时发现有一处语法错误,对这个错误最准确的描述是_。(分数:2.00)A.函数 getK 试图访问基类的私有成员变量 k B.在类 MyDerived 的定义中,基类名 MyBase 前缺少关键字 public、protected 或 privateC.类 MyDerived 缺少一个无参的构造函数D.类 MyDerived 的构造函数没有对基类数据成员 k 进行初始化解析:解析 此题考查的是派生类对基类成员的访问。因为类中缺省的访问权限是私有,所以本题中MyBase 类中定义的成员 k 是私有成员。派生类中的成员只能访问基类中的公有成员和保护成员,不能访问基类中的私有成员。所以派生类中函数 getK()中的语句 return k;是非法的。17.派生类的成员函数不能访问基类的_。(分数:2.00)A.公有成员和保护成