1、国家二级 C+机试(类和对象)模拟试卷 16及答案解析(总分:52.00,做题时间:90 分钟)一、选择题(总题数:26,分数:52.00)1.有如下程序 #inc1udeiostream #inc1udeiomanip using namespace std; c1ass MyClass public: MyClass()coutA;) MyClass(charc)coutc; MyClass()coutB; ; int main() MyClass p1,*p2; p2 newMyClass(X); delete p2; retum 0; 执行这个程序屏幕上将显示输出( )。(分数:2.0
2、0)A.ABXB.ABXBC.AXBD.AXBB2.有如下程序: #inc1udeiostream using namespace std; c1ass test private: int a; public: test0 cout+“constructor“+end1; test(int a)cout+a+end1;) test(const test test( )Cout+“dcstructor“+end1; ; int main() test A(3); retum 0; 运行时输出的结果是( )。(分数:2.00)A.3B.constructor destructorC.copy De
3、structorD.3 destructor3.对于一个类定义,下列叙述中错误的是( )。(分数:2.00)A.如果没有定义拷贝构造函数,编译器将生成一个拷贝构造函数B.如果没有定义缺省的构造函数,编译器将一定生成一个缺省的构造函数C.如果没有定义构造函数,编译器将生成一个缺省的构造函数和一个拷贝构造函数D.如果已经定义了构造函数和拷贝构造函数,编译器不会生成任何构造函数4.有如下程序: #inc1udeiostream using namespace std; c1ass Part public: Part(int x=0):val(x)coutval; Part0 coutval;) pr
4、ivate: int val, ; c1ass 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.123321B.213312C.213D.1231235.有如下程序: #inc1udeiostream using namespace std; c1ass Base public: Base
5、(int x=0)coutx; ; c1ass Derived:public Base public: Derived(int x=0)coutx, private: Base val; ; int main() Derived d(1); retum 0; 程序的输出结果是( )。(分数:2.00)A.0B.1C.01D.0016.有如下类定义: c1ass MyClass Int value, public; MyClass(int n): value (n) int gerValue()const return value; ; 则类 MyClass的构造函数的个数是( )。(分数:2.
6、00)A.1个B.2个C.3个D.4个7.在 C+中,编译系统自动为一个类生成缺省构造函数的条件是( )。(分数:2.00)A.该类没有定义任何有参构造函数B.该类没有定义任何无参构造函数C.该类没有定义任何构造函数D.该类没有定义任何成员函数8.有如下程序: #inc1udeiostream using namespace std; c1ass Samp1e public: Samp1e() Samp1e()cout*; ; int main() Samp1e temp2, *pTemp2; retum 0; 执行这个程序输出星号(*)的个数为( )。(分数:2.00)A.1B.2C.3D.
7、49.有如下程序: #inc1udeiostream using namespace std; c1ass MyClass public: MyClass(int i=0)cout1; MyClass(const MyClass MyClass return*tlus; MyClass()cout4; ; int main() MyClass obj1(l),obj2(2),obj3(objl); retum 0: 运行时的输出结果是( )。(分数:2.00)A.112444B.11114444C.121444D.1131444410.有如下程序: #inc1udeiostream #inc1
8、udecstring using namespace std; c1ass XCF int a; public: XCF (int aa=0): a(aa)cout“1“; XCF(XCFx)a=xa;cout“2“; XCF()couta; int Geta()returna; ; int main() XCF dl(5), d2(d1); XCF *pd=new XCF(8); coutpdGeta(); delete pd; return 0; 运行时的输出结果是( )。(分数:2.00)A.1215588B.1218855C.12185D.12851211.有如下程序: #inc1ud
9、eiostream using namespace std; c1ass ONE int C; public: ONE():c(O)coutl;) ONE(int n): c(n)cout2;) ; c1ass TWO ONE one1; ONE one2; public: TWO(int m): one2(m)cout3; ; int main() TWO t(4); return 0; 运行时的输出结果是( )。(分数:2.00)A.3B.23C.123D.21312.Samp1e是一个类,执行下面语句后,调用 Samp1e类的构造函数的次数是( )。 Samp1e a2, *P=new
10、Samp1e;(分数:2.00)A.0B.1C.2D.313.有如下程序: #inc1ude iostream using namespace std; c1ass Toy public: Toy(char* _n) strcpy(name, _n), count+; Toy()count; char* GetName() retum name,) static int getCount() return count; private: char name10; static int count; ; intToy:count=0; int main() Toy tl(“Snoopy“), t
11、2(“Mickey“), t3(“Barbie“); coutt1getCount()end1; return 0; 还行时的输出结果是( )。(分数:2.00)A.1B.2C.3D.运行时出错14.有如下程序: #inciude iostream using namespace std; c1ass Name char name20; public: Name() strcpy(name,“); cout?; Name(char *fname) strcpy(name,fname); cout?; ; int main() Name names3=Name(“张三“),Name(“李四“);
12、 return 0; 运行此程序输出符号?的个数是( )。(分数:2.00)A.0B.1C.2D.315.有如下程序 #inc1ude iostream using namespace std; c1ass Test public: Test() Test(const Testretum t; int main()Test x,y; x=fun(y);return 0; 运行这个程序的输出结果是( )。(分数:2.00)A.无输出B.1C.11D.11116.若 MyClass为一个类,执行“MyClass a41, *p5;“语句时会自动调用该类构造函数的次数是( )。(分数:2.00)A.
13、2B.5C.4D.917.有如下程序: #inc1ude iostream using namespace std; c1ass CD public: CD()couF,C; private: char name80; ; int main()CD a,*b, d2;return 0; 运行时的输出结果是( )。(分数:2.00)A.CCCCB.CCCC.CCD.C18.有如下程序: #inc1ude iostream using namespace std; c1ass XA int a; public: static int b; XA(int aa):a(aa)b+; XA() int
14、get()retum a; ; int XA:b =0; int main() XA dl(2),d2(3); coutd1get()+d2get()+XA:bend1; return 0; 运行时的输出结果是( )。(分数:2.00)A.5B.6C.7D.819.下列关于析构函数的描述中,错误的是( )。(分数:2.00)A.析构函数可以重载B.析构函数由系统自动调用C.每个对象的析构函数只被调用一次D.每个类都有析构函数20.下列关于构造函数的描述中,错误的是( )。(分数:2.00)A.构造函数名与类名相同B.构造函数可以有返回值C.构造函数可以重载D.每个类都有构造函数21.若 PAT
15、是一个类,则程序运行时,语句“PAT*ad3;”调用 PAT的构造函数的次数是( )。(分数:2.00)A.0B.1C.2D.322.有如下程序: #inc1udeiostream using namespace std; c1ass MyClass public: MyClass () cout *; MyClass (MyClass MyClass() cout ; ; int main(), MyClass a; Myc1ass b(a); return 0; 运行时的输出结果是( )。(分数:2.00)A.*#B.#*C.*#D.#*23.有如下程序: #inc1udeiostream
16、 using namespace std; c1ass Monkey public: Monkey() coutM; Monkey(char n) coutn; Monkey() coutY; ; int main() Monkey p1,*p2; p2=new Monkey(X); delete p2; return0; 运行这个程序的输出结果是( )。(分数:2.00)A.MYXB.MYMYC.MXYD.MXYY24.下列关于类成员对象构造函数调用顺序的叙述中,正确的是( )。(分数:2.00)A.与它们在初始化列表中的顺序相同B.与它们在类中声明的顺序相同C.与析构函数的调用顺序相同D.
17、顺序不确定25.有如下程序: #inc1udeiostream #inc1udecstring using namespace std; c1ass MyString public: char str80; MyString(const char*s) strcpy(str,s);) MyString ; ostream int main() MyString x(“abc“),y(“cde“); cout(x+=y)end1; return 0; 运行这个程序的输出结果是( )。(分数:2.00)A.abcB.cdeC.abcdeD.abccde26.下列关于 this指针的叙述中,正确的是
18、( )。(分数:2.00)A.任何与类相关的函数都有 this指针B.类的成员函数都有 this指针C.类的友元函数都有 this指针D.类的非静态成员函数才有 this指针国家二级 C+机试(类和对象)模拟试卷 16答案解析(总分:52.00,做题时间:90 分钟)一、选择题(总题数:26,分数:52.00)1.有如下程序 #inc1udeiostream #inc1udeiomanip using namespace std; c1ass MyClass public: MyClass()coutA;) MyClass(charc)coutc; MyClass()coutB; ; int
19、main() MyClass p1,*p2; p2 newMyClass(X); delete p2; retum 0; 执行这个程序屏幕上将显示输出( )。(分数:2.00)A.ABXB.ABXBC.AXBD.AXBB 解析:解析:此题考查的是构造函数和析构函数。构造函数在对象被创建的时候由系统自动调用,而析构函数在对象的生存期即将结束的时候由系统自动调用。此题中,主程序在创建 MayClass类的对象 p1时,调用 MayClass类的默认构造函数,输出字母 A:然后在创建p2 对象时,调用带字母参数的构造函数,输出字母 X;语句 delete p2;调用析构函数,输出字母 B:在主函数退
20、出时,调用析构函数清除对象 p1,输出字母 B。2.有如下程序: #inc1udeiostream using namespace std; c1ass test private: int a; public: test0 cout+“constructor“+end1; test(int a)cout+a+end1;) test(const test test( )Cout+“dcstructor“+end1; ; int main() test A(3); retum 0; 运行时输出的结果是( )。(分数:2.00)A.3B.constructor destructorC.copy De
21、structorD.3 destructor 解析:解析:此题考查的是构造函数和析构函数。一个类可以有多个构造函数,但只能有一个析构函数。每一个对象在被创建时,都会隐含调用众多构造函数中的一个,而在销毁时又会隐含调用唯一的析构函数。此题中,主函数创建对象 A是会隐含调用 test(int a)这个构造函数,输出 3;接着主函数结束,对象 A销毁又隐含调用test()析构函数输出 destructor。3.对于一个类定义,下列叙述中错误的是( )。(分数:2.00)A.如果没有定义拷贝构造函数,编译器将生成一个拷贝构造函数B.如果没有定义缺省的构造函数,编译器将一定生成一个缺省的构造函数 C.如
22、果没有定义构造函数,编译器将生成一个缺省的构造函数和一个拷贝构造函数D.如果已经定义了构造函数和拷贝构造函数,编译器不会生成任何构造函数解析:解析:此题考查的是构造函数。如果一个类中没有定义任何构造函数,编译器将生成一个不带参数的公有缺省构造函数。但只要定义了一个任意的构造函数,就不会生成缺省构造函数了。4.有如下程序: #inc1udeiostream using namespace std; c1ass Part public: Part(int x=0):val(x)coutval; Part0 coutval;) private: int val, ; c1ass Whole publ
23、ic: 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.123321B.213312 C.213D.123123解析:解析:此题考查的是类的构造与析构。建立类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序(自左向右)接着执行成员对象的构造函数,调用顺序按照各个成员对象在类
24、中声明的顺序,最后执行自身的构造函数。析构顺序与之相反。本题中,Whole 类中有两个 Part类的成员 p1和 p2,根据它们定义的顺序,先构造 p1再构造 p2。所以,首先被构造的是p1(y),输出 2;第二个被构造的是 p2(x),输出 1;最后调用析构函数,输出 val的值 3;析构函数调用顺序与构造函数相反。故最后输出 213312。5.有如下程序: #inc1udeiostream using namespace std; c1ass Base public: Base(int x=0)coutx; ; c1ass Derived:public Base public: Deriv
25、ed(int x=0)coutx, private: Base val; ; int main() Derived d(1); retum 0; 程序的输出结果是( )。(分数:2.00)A.0B.1C.01D.001 解析:解析:此题考查的是类的构造。建立类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序(自左向右)执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序执行自身的构造函数。本题中,首先会构造基类 Base,调用 Base类的构造函数,输出 0;然后还定义了一个 Base类的对象,再次调用 Base类的默认构造函数输出 0;
26、最后构造自身,因主函数中传入了构造参数 1,所以输出 1。故最后输出结果是:001。6.有如下类定义: c1ass MyClass Int value, public; MyClass(int n): value (n) int gerValue()const return value; ; 则类 MyClass的构造函数的个数是( )。(分数:2.00)A.1个 B.2个C.3个D.4个解析:解析:此题考查的是构造函数的概念。构造函数的名字必须与类名相同;构造函数不指定返回值类型;构造函数可以重载:在创建对象时,系统会自动调用构造函数。7.在 C+中,编译系统自动为一个类生成缺省构造函数的条
27、件是( )。(分数:2.00)A.该类没有定义任何有参构造函数B.该类没有定义任何无参构造函数C.该类没有定义任何构造函数 D.该类没有定义任何成员函数解析:解析:如果一个类中定义了一个缺省的构造函数,则使用该函数。如果一个类中没有定义任何构造函数,编译器将生成一个不带参数的共有缺省构造函数。8.有如下程序: #inc1udeiostream using namespace std; c1ass Samp1e public: Samp1e() Samp1e()cout*; ; int main() Samp1e temp2, *pTemp2; retum 0; 执行这个程序输出星号(*)的个数
28、为( )。(分数:2.00)A.1B.2 C.3D.4解析:解析:在 maln函数中,定义了 Samp1e temp2的一个包含两个对象的数组,还定义了一个*pTemp2,是包含两个指向类对象的指针的数组,故定义的指针当 main函数结束后是不会调用析构函数的,只有包含两个对象的数组 temp2会调用析构函数,因此只输出两个*。9.有如下程序: #inc1udeiostream using namespace std; c1ass MyClass public: MyClass(int i=0)cout1; MyClass(const MyClass MyClass return*tlus;
29、MyClass()cout4; ; int main() MyClass obj1(l),obj2(2),obj3(objl); retum 0: 运行时的输出结果是( )。(分数:2.00)A.112444 B.11114444C.121444D.11314444解析:解析:当创建 MyClass类对象 obj1(1)和 obj2(2)时候,调用类构造函数会输出两个 1,然后创建类对象 obj3(obj(1)时,会调用拷贝类构造函数,输出一个 2,然后当 main函数结束时候,调用三个对象的析构函数会输出三个 4。10.有如下程序: #inc1udeiostream #inc1udecstr
30、ing using namespace std; c1ass XCF int a; public: XCF (int aa=0): a(aa)cout“1“; XCF(XCFx)a=xa;cout“2“; XCF()couta; int Geta()returna; ; int main() XCF dl(5), d2(d1); XCF *pd=new XCF(8); coutpdGeta(); delete pd; return 0; 运行时的输出结果是( )。(分数:2.00)A.1215588B.1218855 C.12185D.128512解析:解析:在这个程序中在建立对象 d1(5)
31、时,调用构造函数 XCF(int aa=0):a(aa) cout“1“;),输出 1;在建立 d2(d1)时,调用拷贝构造函数 XCF(XCF调用析构函数XCFO,输出 8:当退出程序时,分别释放对象 d2、d1,输出 55。11.有如下程序: #inc1udeiostream using namespace std; c1ass ONE int C; public: ONE():c(O)coutl;) ONE(int n): c(n)cout2;) ; c1ass TWO ONE one1; ONE one2; public: TWO(int m): one2(m)cout3; ; int
32、 main() TWO t(4); return 0; 运行时的输出结果是( )。(分数:2.00)A.3B.23C.123 D.213解析:解析:由类 TWO的定义可知,其成员为类 ONE的两个对象 onel和 one2。所以在主函数中构建类TWO的对象 t(4)时,先后调用类 ONE的构造函数 ONE():(0)(count1,和 ONE(int n): c(n) cout2:j 输出 12,然后再调用类 TWO的构造函数 TWO(int m):one2(m) cout3;,输出 3。12.Samp1e是一个类,执行下面语句后,调用 Samp1e类的构造函数的次数是( )。 Samp1e
33、a2, *P=new Samp1e;(分数:2.00)A.0B.1C.2D.3 解析:解析:在 C+中,声明一个类对象时,编译程序需要调用类的构造函数为对象分配存储空间,进行必须的初始化。在本题的这条语句中,声明了一个 Samp1e类型的包含 2个数组元素的数组 a2,一个指向类 Samp1e对象的指针 P,所以 Samp1e类的构造函数共调用了 3次。13.有如下程序: #inc1ude iostream using namespace std; c1ass Toy public: Toy(char* _n) strcpy(name, _n), count+; Toy()count; cha
34、r* GetName() retum name,) static int getCount() return count; private: char name10; static int count; ; intToy:count=0; int main() Toy tl(“Snoopy“), t2(“Mickey“), t3(“Barbie“); coutt1getCount()end1; return 0; 还行时的输出结果是( )。(分数:2.00)A.1B.2C.3 D.运行时出错解析:解析:类 Toy中包含一个字符数组 name和一个静态整型变量 count。在程序中首先给类 To
35、y的成员 count的赋初始值 O,然后在主函数中,定义了三个 Toy对象 t1、t2、t3,并分别对它们的 name宰段赋值,在赋值的同时变量 count的值加 l,所以最后变量 count的值等于 3。14.有如下程序: #inciude iostream using namespace std; c1ass Name char name20; public: Name() strcpy(name,“); cout?; Name(char *fname) strcpy(name,fname); cout?; ; int main() Name names3=Name(“张三“),Name(
36、“李四“); return 0; 运行此程序输出符号?的个数是( )。(分数:2.00)A.0B.1C.2D.3 解析:解析:类 Name有两个构造函数,在默认构造函数中,给字符数组 name赋空值并输出一个?;在带有字符指针的构造函数中,把字符指针 fname所指的字符串赋给字符数组 name,并输出一个?。所以在主函数中,定义了 Name的三个对象,name0、name1、name2,在创建这三个对象时,会调用构造带参数的函数对前两个对象赋值,调用默认的构造函数把 name2的值赋为空值。这时会输出三个“?”符号。15.有如下程序 #inc1ude iostream using names
37、pace std; c1ass Test public: Test() Test(const Testretum t; int main()Test x,y; x=fun(y);return 0; 运行这个程序的输出结果是( )。(分数:2.00)A.无输出B.1C.11 D.111解析:解析:在类 Test中定义拷贝构造函数 Test(const Test “语句时会自动调用该类构造函数的次数是( )。(分数:2.00)A.2B.5C.4 D.9解析:解析:语句 MyClass a4,*p5不仅定义了 4个 MyClass对象,分别为 a0,a1,a2,a3,而且定义了 5个指向 MyCla
38、ss对象的指针变量,分别为*p0,*p1,p2,*p3,*p4,所以共调用 MyClass的构造函数 4次。17.有如下程序: #inc1ude iostream using namespace std; c1ass CD public: CD()couF,C; private: char name80; ; int main()CD a,*b, d2;return 0; 运行时的输出结果是( )。(分数:2.00)A.CCCCB.CCC C.CCD.C解析:解析:在这个程序的主函数中定义了 3个 CD类的实例对象 a,d0,d1和一个指向 CD类对象的指针变量 b,所以当程序结束时,执行 C
39、D的析构函数输出字符 C三次。18.有如下程序: #inc1ude iostream using namespace std; c1ass XA int a; public: static int b; XA(int aa):a(aa)b+; XA() int get()retum a; ; int XA:b =0; int main() XA dl(2),d2(3); coutd1get()+d2get()+XA:bend1; return 0; 运行时的输出结果是( )。(分数:2.00)A.5B.6C.7 D.8解析:解析:执行 XA类的实例变量 d1(2)时,成员函数 dlget()的
40、返回值等于 2,XA,b 的值等于 l,执行 XA类的实例变量 d2(3)时,成员函数 dlget()的返回值等于 3,XAb 的值等于 2,所以输出结果为2+3+2=7。19.下列关于析构函数的描述中,错误的是( )。(分数:2.00)A.析构函数可以重载 B.析构函数由系统自动调用C.每个对象的析构函数只被调用一次D.每个类都有析构函数解析:解析:一般情况下,析构函数在对象的生存周期即将结束的时候由系统自动调用。在调用完成之后,对象也就消失了,相应的内存空间也被释放。析构函数没有参数,因此析构函数不能重载,一个类中只能定义一个析构函数。20.下列关于构造函数的描述中,错误的是( )。(分数
41、:2.00)A.构造函数名与类名相同B.构造函数可以有返回值 C.构造函数可以重载D.每个类都有构造函数解析:解析:构造函数具有下面 4个特殊的性质:构造函数的名字必须与类名相同;构造函数不指定返回类型,它隐含有返回值,由系统内部使用:构造函数可以有一个或多个参数,因此构造函数可以重载;在创建对象时,系统会自动调用构造函数。21.若 PAT是一个类,则程序运行时,语句“PAT*ad3;”调用 PAT的构造函数的次数是( )。(分数:2.00)A.0 B.1C.2D.3解析:解析:语句“PAT(*ad)3”定义了含有 3个元素的指向类 PAT类型的指针数组 ad。22.有如下程序: #inc1u
42、deiostream using namespace std; c1ass MyClass public: MyClass () cout *; MyClass (MyClass MyClass() cout ; ; int main(), MyClass a; Myc1ass b(a); return 0; 运行时的输出结果是( )。(分数:2.00)A.*#B.#*C.*# D.#*解析:解析:程序在执行时,先创建类对象 a,输出,再创建类对象 b,输出#,然后再依次调用类对象b和 a的析构函数,输出两个。23.有如下程序: #inc1udeiostream using namespace
43、 std; c1ass Monkey public: Monkey() coutM; Monkey(char n) coutn; Monkey() coutY; ; int main() Monkey p1,*p2; p2=new Monkey(X); delete p2; return0; 运行这个程序的输出结果是( )。(分数:2.00)A.MYXB.MYMYC.MXYD.MXYY 解析:解析:在类 Monkey中定义了默认的构造函数和带参数的构造函数,所以在主函数中,定义 Monkey的对象 p1时,调用默认的构造函数,输出 M;定义 Monkey的对象 p2时,调用带参数的构造函数,输
44、出 X;在执行“delete p2;”语句时,调用析构函数,输出 Y,在退出程序时,调用析构函数输出 Y。24.下列关于类成员对象构造函数调用顺序的叙述中,正确的是( )。(分数:2.00)A.与它们在初始化列表中的顺序相同B.与它们在类中声明的顺序相同 C.与析构函数的调用顺序相同D.顺序不确定解析:解析:类成员对象构造函数的调用是按照在类中定义的顺序进行的,而不是按照构造函数说明后的冒号顺序进行构造的。25.有如下程序: #inc1udeiostream #inc1udecstring using namespace std; c1ass MyString public: char str
45、80; MyString(const char*s) strcpy(str,s);) MyString ; ostream int main() MyString x(“abc“),y(“cde“); cout(x+=y)end1; return 0; 运行这个程序的输出结果是( )。(分数:2.00)A.abcB.cdeC.abcdeD.abccde 解析:解析:在类 MyString中,定义了带参数的构造甬数 MyString(const char*s),其作用是把 s指向的字符串拷贝到字符组 str中。在类中还对运算+=进行重载定义,其作用是把字符串 str和 a相连接并赋给 str,所以在主函数中执行 x+=y时,结果为 abccde。26.下列关于 this指针的叙述中,正确的是( )。(分数:2.00)A.任何与类相关的函数都有 this指针B.类的成员函数都有 this指针C.类的友元函数都有 this指针D.类的非静态成员函数才有 this指针 解析:解析:此题考查的是 this指针的使用。类的每一个成员函数都有一个隐含的常量指针,即 this指针。类的静态成员函数不能含有 this指针,因为 this指针是一个指向本对象的指针。