1、国家二级 C+机试(类和对象)模拟试卷 7及答案与解析 一、选择题 1 下列情况中,不会调用拷贝构造函数的是 ( )。 ( A)用一个对象去初始化同一类的另一个新对象时 ( B)将类的一个对象赋值给该类的另一个对象时 ( C)函数的形参是类的对象,调用函数进行形参和实参结合时 ( D)函数的返回值是类的对象,函数执行返回调用时 2 有如下程序 #inc1ude iostream #inc1ude iomanip using namespace std; class Myclass public: Myclass()cout A; Myclass(char c) cout c, Myclass(
2、)cout B; ; int main() Myclass p1, *p2; p2= newMyclass(X); delete p2; return 0; 执行这个程序屏幕上将显示输出 ( )。 ( A) ABX ( B) ABXB ( C) AXB ( D) AXBB 3 有如下程序: #inc1ude iostream using namespace std; class test private: int a; public: test0 cout+“constructor“+end1; test(int a)cout+a+endl; test(const test&test) a=
3、test a; cout+, copy constructor“+endl; test() Cout+“destructor“+end1; ; int main() test A(3); return 0; 运行时输出的结果是 ( )。 ( A) 3 ( B) constructordestructor ( C) copy constructor ( D) 3destructor destructor 4 对于一个类定义,下列叙述中错误的是 ( )。 ( A)如果没有定义拷贝构造函数,编译器将生成一个拷贝构造函数 ( B)如果没有定义缺省的构造函数,编译器将一定生成一个缺省的构造函数 ( C)
4、如果没有定义构造函数,编译器将生成一个缺省的构造函数和一个拷贝构造函数 ( D)如果已经定义了构造函数和拷贝构造函数,编译器不会生成任何构造函数 5 有如下程序: #inc1ude iostream using namespace std; class Part public: Part(int x=0): val(x) cout val; Part()cout val; prlVate: int va1: ; c1Iass Whole public: Wh01e(int x, int y, int z=0): p2(x), pl(y), Val(z)cout Val; Who1e()cout
5、 Val; ) priVate: Parrt p1, p2; int va1: ; int main() Whole obj(1, 2, 3); return 0: 程序的输出结果是 ( )。 ( A) 123321 ( B) 213312 ( C) 213 ( D) 123123 6 有如下程序: #inc1ude iostream using namespace std; class Base public: Base(int x=0)cout x; ; class DeriVed: public Base public: Derived(int x=0)cout x; private:
6、Base val: ; int main() Derived d(1); return 0; 程序的输出结果是 ( )。 ( A) 0 ( B) 1 ( C) 01 ( D) 001 7 有如下类定义: class Myclass Int value: pUblic; Myclass(int n): Value(n) int gerValue()constretum Value; ; 则类 Myclass的构造函数的个数是 ( )。 ( A) 1个 ( B) 2个 ( C) 3个 ( D) 4个 8 在 C+中,编译系统自动为一个类生成缺省构造函数的条件是 ( )。 ( A)该类没有定义任何有
7、参构造函数 ( B)该类没有定义任何无参构造函数 ( C)该类没有定义任何构造函数 ( D)该类没有定义任何成员函数 9 有如下程序: #inc1ude iostream using namespace std; class Sample public: Sample() Sample() cout *; ) ; int main() Sample temp2, *pTemp2; return 0; 执行这个程序输出星号 (*)的个数为 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 10 有如下程序: #inc1ude iostream using namespace st
8、d; class Myclass public: Myclass(int i: 0) cout1; Myclass(const MyQlass&x) cout 2; Myclass& operator=(const Myclass&x) cout 3; return*this; Myclass() cout 4; ; int main() Myclass obj1(1), obj 2(2), obj 3(obj1); return 0: 运行时的输出结果是 ( )。 ( A) 112444 ( B) 11114444 ( C) 121444 ( D) 11314444 11 有如下程序: #i
9、nc1ude iostream #inc1ude cstring using namespace std; class XCF int a; public: XCF (int aa=0): a(aa)cout “1“; XCF(XCF&x)a=x a; cout “2“; XCF()cout a; int Geta()return a; ; int main() XCF dl(5), d2(dl); XCF *pd=new XCF(8); cout pd一 Geta(); delete pd; return 0: 运行时的输出结果是 ( )。 ( A) 1215588 ( B) 1218855
10、 ( C) 12185 ( D) 128512 12 有如下程序: #inc1ude iostream using namespace std; class ONE int C: public: ONE(): c(0)cout 1; ) ONE(int n): c(n)cout 2; ) ; class TWO ONE one1; ONE one2; public: TWO(int m): one2(m)cout 3; ; int main() TWO t(4); return 0: 运行时的输出结果是 ( )。 ( A) 3 ( B) 23 ( C) 123 ( D) 213 13 Samp
11、le是一个类,执行下面语句后,调用 Sample类的构造函数的次数是( )。 Sample a2, *P=new Sample; ( A) 0 ( B) 1 ( C) 2 ( D) 3 14 有如下程序: #inc1ude iostream using namespace std; class Toy public: Toy(char* _n) strcpy(name, _n); count+, Toy()count-, char* GetName() return name, static int getCount() return count; ) private: char name10
12、;, static int count, ; int Toy: count=0; int main() Toy tl(“Snoopy“), t2(“Mickey“), t3(“Barbie“); cout t1 getCount() endl; return 0; 运行时的输出结果是 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D)运行时出错 15 有如下程序: #inc1ude iostream using namespace std; class Name char name20; public: Name() strcpy(name, “); cout ?; Name(cha
13、r *fname) strcpy(name, fname); cout ?; ; int main() Name names3= Name(“张三 “), Name(“李四 “); return 0; 运行此程序输出符号?的个数是 ( )。 ( A) 0 ( B) 1 ( C) 2 ( D) 3 16 有如下程序 #inc1ude iostream using namespace std; class Test public: Test() Test(const Test&t)cout 1, ; Test fun(Test &u) Test t=u; return t; int main()
14、Test x, y; x=fun(y); return 0; 运行这个程序的输出结果是 ( )。 ( A)无输出 ( B) 1 ( C) 11 ( D) 111 17 若 Myclass为一个类,执行 “Myclass a4, *p5; ”语句时会自动调用该类构造函数的次数是 ( )。 ( A) 2 ( B) 5 ( C) 4 ( D) 9 18 有如下程序: #inc1ude iostream using namespace std; class CD public: CD()cout C; ) private: char name80; ; int main() CD a, *b, d2;
15、 return 0; 运行时的输出结果是 ( )。 ( A) CCCC ( B) CCC ( C) CC ( D) C 19 有如下程序: #inc1ude iostream 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 dl(2), d2(3); cout dl get()+d2 get()+XA: b endl; return 0: 运行时的输出结果是 ( )。 ( A
16、) 5 ( B) 6 ( C) 7 ( D) 8 20 下列关于析构函数的描述中,错误的是 ( )。 ( A)析构函数可以重载 ( B)析构函数由系统自动调用 ( C)每个对象的析构函数只被调用一次 ( D)每个类都有析构函数 21 下列关于构造函数的描述中,错误的是 ( )。 ( A)构造函数名与类名相同 ( B)构造函数可以有返回值 ( C)构造函数可以重载 ( D)每个类都有构造函数 22 若 PAT是一个类,则程序运行时,语句 “PAT*ad) 3; ”,调用 PAT的构造函数的次数是( )。 ( A) 0 ( B) 1 ( C) 2 ( D) 3 23 有如下程序: #inc1ude
17、 iostream using namespace std; class Myclass public: Myclass () cout *; Myclass (Myclass&a) cout #; Myclass() cout ; ; int main(), Myclass a; Myclass b(a); return 0: 运行时的输出结果是 ( )。 ( A) *# ( B) #* ( C) *# ( D) #* 24 有如下程序: #inc1ude iostream using namespace std; class Monkey public: Monkey() cout M;
18、Monkey(char n) cout n; Monkey() cout Y; ; int main() Monkey pl, *p2; p2=new Monkey(X); delete p2; return 0: 运行这个程序的输出结果是 ( )。 ( A) MYX ( B) MYMY ( C) MXY ( D) MXYY 25 下列关于类成员对象构造函数调用顺序的叙述中,正确的是 ( )。 ( A)与它们在初始化列表中的顺序相同 ( B)与它们在类中声明的顺序相同 ( C)与析构函数的调用顺序相同 ( D)顺序不确定 26 有如下程序: #inc1ude iostream #inc1ude
19、 cstring using namespace std; class MyString public: char str80; MyString(const char*s) strcpy(str, s); MyString& operator+=(MyString a) strcat(str, a str); return *this; ; ostream& operator (ostream& s, const MyString& z)return s z str, int main() MyString x(”2lbc), y(“cde“); cout (x+=y) endl; retu
20、rn 0; 运 行这个程序的输出结果是 ( )。 ( A) abc ( B) cde ( C) abcde ( D) abccde 27 下列关于 this指针的叙述中,正确的是 ( )。 ( A)任何与类相关的函数都有 this指针 ( B)类的成员函数都有 this指针 ( C)类的友元函数都有 this指针 ( D)类的非静态成员函数才有 this指针 28 有如下头文件: int fl(), static int f2(); class MA public: int f3(); static int f4(); ; 在所描述的函数中,具有隐含的 this指针的是 ( )。 ( A) f
21、1 ( B) f2 ( C) f3 ( D) f4 国家二级 C+机试(类和对象)模拟试卷 7答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 此题考查的是复制构造函数的概念。用 个已知的对象初始化一个正在创建的同类对象时,就会发生复制构造函数。因此,选项 A、 C、 D均会调用复制构造函数,而只有选项 B没有创建的动作,不调用复制构造函数。 【知识模 块】 类和对象 2 【正确答案】 D 【试题解析】 此题考查的是构造函数和析构函数。构造函数在对象被创建的时候由系统自动调用,而析构函数在对象的生存期即将结束的时候由系统自动调用。此题中,主程序在创建 MayClass类的对象 pl时
22、,调用 MayClass类的默认构造函数,输出字母 A;然后在创建 *p2对象时,调用带字母参数的构造函数,输出字母X;语句 delete p2;调用析构函数,输出字母 B;在主函数退出时,调用析构函数清除对象 p1,输出字母 B。 【知识模块】 类和对象 3 【正确答案】 D 【试题解析】 此题考查的是构造函数和析构函数。一个类可以有多个构造函数,但只能有一个析构函数。每一个对象在被创建时,都会隐含调用众多构造函数中的一个,而在销毁时又会隐含调用唯一的析构函数。此题中,主函数创建对象 A是会隐含调用 test( int a)这个构造函数,输出 3:接着主函数结束,对象 A销毁又隐含调用 te
23、st()析构函数输出 destructor。 【知识模块】 类和对象 4 【正确答案】 B 【试题解析】 此题考查的是构造函数。如果 个类中没有定义任何构造函数,编译器将生成一个 不带参数的公有缺省构造函数。但只要定义了一个任意的构造函数,就不会生成缺省构造函数了。 【知识模块】 类和对象 5 【正确答案】 B 【试题解析】 此题考查的是类的构造与析构。建立类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序(自左向右)接着执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序,最后执行自身的构造函数。析构顺序与之相反。本题中, Whole类
24、中有两个 Part类的成员 pl和 p2,根据它们定义的顺序,先构造 pl再构造 p2。 所以,首先被构造的是 pl( y),输出 2;第二个被构造的是 p2( x),输出 1;最后调用析构函数,输出 val的值 3;析构函数调用顺序与构造函数相反。故最后输出 213312。 【知识模块】 类和对象 6 【正确答案】 D 【试题解析】 此题考查的是类的构造。建立类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序(自左向右)执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序执行自身的构造函数。本题中,首先会构造基类 Base,调用 Bas
25、e类的构造函数,输出 0;然后还定义了一个 Base类的对象,再次调用 Base类的默认构造函数输出 0;最后构造自身,因主函数中传入了构造参数 1,所以输出 l。故最后输出结果是: 001。 【知识模块】 类和对象 7 【正确答案】 A 【试题解析】 此题考查的是构造函数的概念。构造函数的名字必须与类名相同;构造函数不指定返回值类型;构造函数可以重载:在创建对象时,系统会自动调用构造函数。 【知识模块】 类和对象 8 【正确答案】 C 【试题解析】 如果一个类中定义了一个缺省的构造函数 ,则使用该函数。如果一个类中没有定义任何构造函数,编译器将生成一个不带参数的共有缺省构造函数。 【知识模块
26、】 类和对象 9 【正确答案】 B 【试题解析】 在 mam函数中,定义了 Sample temp2的一个包含两个对象的数组,还定义了一个 *pTemp2,是包含两个指向类对象的指针的数组,故定义的指针当 main函数结束后是不会调用析构函数的,只有包含两个对象的数组 temp2会调用析构函数,因此只输出两个。 【知识模块】 类和对象 10 【正确答案】 A 【试题解析 】 当创建 MyClass类对象 objl( l)和 obj2( 2)时候,调用类构造函数会输出两个 1,然后创建类对象 obj3( obj( l时,会调用拷贝类构造函数,输出一个 2,然后当 mam函数结束时候,调用三个对象
27、的析构函数会输出三个 4。 【知识模块】 类和对象 11 【正确答案】 B 【试题解析】 在这个程序中在建立对象 d1( 5)时,调用构造函数 XCF( int aa=0): a( aa) cout ”1”; ,输出 1;在建立 d2( dl)时,调用拷贝构造函数 XCF( XCF&x) a=x a, cout ”2”; ,输出 2:在建立 new XCF( 8)对象时,调用构造函数 XCF ( int aa=0): a( aa) cout ”1”;),输出 1;语句 cout pd一 Geta()的功能是输出 8;语句 delete pd;调用析构函数XCF(),输出 8;当退出程序时,分别
28、释放对象 d2、 dl,输出 55。 【知识模块】 类和对象 12 【正确答案】 C 【试题解析】 由类 TWO的定义可知,其成员为类 ONE的两个对象 onel和one2。所以在主函数中构建类 TWO的对象 t( 4)时,先后调用类 ONE的构造函数 ONE(): c( 0) cout 1; 和 ONE( int n): c( n) cout 2; 输出12,然后再调用类 TWO的构造函数 TWO( int m): one2( m) cout3; ,输出 3。 【知识模块】 类和对象 13 【正确答案】 D 【试题解析】 在 C+中,声明一个类对象时,编译程序需要调用类的构造函数为对象分配存
29、储空间,进行必须的初始化。在本题的这条语句中,声明了一个Sample类型的包含 2个数组元素的数组 a2,一个指向类 Sample对象的指针 P,所以 Sample类的构造函数共调用了 3次。 【知识模块】 类和对象 14 【正确答案】 C 【试题解析】 类 Toy中包含一个字符数组 name和一个静态整型变量 count。在程序中首先给类 Toy的成员 count的赋初始值 0,然后在主函数中,定义了三个Toy对象 t1、 t2、 t3,并分别对它们的 name字段赋值,在赋值的同时变量 count的值加 l,所以最后变量 count的值等于 3, 【知识模块】 类和对象 15 【正确答案】
30、 D 【试题解析】 类 Name有两个构造函数,在默认构造函数中 ,给字符数组 name赋空值,并输出一个?;在带有字符指针的构造函数中,把字符指针 fname所指的字符串赋给字符数组 name,并输出一个?。所以在主函数中,定义了 Name的三个对象, name0、 namel、 name2,在创建这三个对象时,会调用构造带参数的函数对前两个对象赋值,调用默认的构造函数把 name2的值赋为空值。这时会输出三个 “? ”符号。 【知识模块】 类和对象 16 【正确答案】 C 【试题解析】 在类 Test中定义拷贝构造函数 Test( const Test &t), 其函数体为输出 1,在主函
31、数 mam中,当执行语句 x一 fun( y),调用拷贝函数用对象 y的值构造对象 u,输出 l,在执行函数 fun()的 return语句时,调用拷贝函数构造匿名对象,输出 l。 【知识模块】 类和对象 17 【正确答案】 C 【试题解析】 语句 MyClass a4, *p5不仅定义了 4个 MyClass对象,分别为a0, a1, a2, a3,而且定义了 5个指向 MyClass对象的指针变量,分别为*p0, *p1, *p2, *p3, *p4,所以共调用 MyClass的构造函数 4次。 【知识模块】 类和对象 18 【正确答案】 B 【试题解析】 在这个程序的主函数中定义了 3个
32、 CD类的实例对象 a, d0 d1和一个指向 CD类对象的指针变量 b,所以当程序结束时,执行 CD的析构函数输出字符 C三次。 【知识模块】 类和对象 19 【正确答案】 C 【试题解析】 执行 XA类的实例变量 d1( 2)时,成员函数 dl get()的返回值等于 2, XA b的值等于 1,执行 XA类的实例变量 d2( 3)时,成员函数 dl get0的返回值等于 3, XA b的值等于 2,所以输出结果为 2+3+2=7。 【知识模块】 类和对象 20 【正确答案】 A 【试题解析】 一般情况下,析构函数在对象的生存周期即将结束的时候由系统自动调用。在调用完成之后,对象也就消失了
33、,相应的内存空间也被释放。析构函数没有参数,因此析构函数不能重载,一个类中只能定义一个析构函数。 【知识模块】 类和对象 21 【正确答案】 B 【试题解析】 构造函数具有下面 4个特殊的性质:构造函数的名字必须与类名相同;构造函数不指定返回类型,它隐含有返回值,由系统内部使 用:构造函数可以有一个或多个参数,因此构造函数可以重载;在创建对象时,系统会自动调用构造函数。 【知识模块】 类和对象 22 【正确答案】 A 【试题解析】 语句 “PAT( *ad) 3”定义了含有 3个元素的指向类 PAT类型的指针数组 ad。 【知识模块】 类和对象 23 【正确答案】 C 【试题解析】 程序在执行
34、时,先创建类对象 a,输出 *,再创建类对象 b,输出#,然后再依次调用类对象 b和 a的析构函数,输出两个 。 【知识模块】 类和对象 24 【正确答案】 D 【试题解析】 在类 Monkey中定义了默认的构造函数和带参数的构造函数,所以在主函数中,定义 Monkey的对象 pl时,调用默认的构造函数,输出 M;定义Monkey的对象 p2时,调用带参数的构造函数,输出 X;在执行 “delete p2; ”语句时,调用析构函数,输出 Y,在退出程序时,调用析构函数输出 Y。 【知识模块】 类和对象 25 【正确答案】 B 【试题解析】 类成员对象构造函数的调用是按照在类中定义的顺序进行的,
35、而不是按照构造函数说明后的冒号顺序进行构造的。 【知识模块】 类和对象 26 【正确答案】 D 【试题解析】 在类 MyString中,定义了带参数的构造函数 MyString( const char*s),其作用是把 s指向的字符串拷贝到字符组 str中。在类中还对运算 +=进行重载定义,其作用是把字符串 str和 a相连接并赋给 str,所以在主函数中执行x+=y时,结果为 abccde。 【知识模块】 类和对象 27 【正确答案】 D 【试题解析】 此题考查的是 this指针的使用。类的每一个成员函数都有一个隐含的常量指针,即 this指针。类的静态成员函数小能含有 this指针,因为 this指针是一个指向本对象的指针。 【知识模块】 类和对象 28 【正确答案】 C 【试题解析】 此题考查的是 this指针。 this指针是 个隐含的指针,它隐含于每个类的非静态成员函数中,它明确地表示出了成员函数当前操作的数据所属的对象。题目中,只有 f3()满足 “类的非静态成员函数 ”的要求,故应选 C选项。 【知识模块】 类和对象
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1