1、国家二级 C+机试(类和对象)模拟试卷 4及答案与解析 一、选择题 1 有如下类定义: class Foo public: Foo(int v): value(v) Foo() private: F00() int value=0; ; 其中存在语法错误的行是 ( )。 ( A) ( B) ( C) ( D) 2 以下关键字不能用来声明类的访问权限的是 ( )。 ( A) public ( B) static ( C) protected ( D) private 3 下列有关类成员的叙述中,正确的是 ( )。 ( A)友元函数是类的成员函数 ( B)类成员的默认访问权限是私有的 ( C)类成
2、员函数必须声明为公有的 ( D)类的静态数据成员不能是常成员 4 有如下两个类定义: class AA; class BB AAv1, *v2; BB v3; int *v4; 其中有一个成员变量的定义是错误的,这个变量是 ( )。 ( A) v1 ( B) v2 ( C) v3 ( D) v4 5 有如下类定义: class MyClass int b; char a; double c; public: MyClass(): c(0 0), b(0), a(, ) ; 创建这个类的对象时,数据成员的初始化顺序是 ( )。 ( A) a, b, C ( B) c, b, a ( C) b,
3、a, C ( D) c, a, b 6 建立一个类对象时,系统自动调用 ( )。 ( A)析构函数 ( B)构造函数 ( C)静态函数 ( D)友元函数 7 下列关于对象初始化的叙述中,正确的是 ( )。 ( A)定义对象的时候不能对对象进行初始化 ( B)定义对象之 后可以显式地调用构造函数进行初始化 ( C)定义对象时将自动调用构造函数进行初始化 ( D)在一个类中必须显式地定义构造函数实现初始化 8 有如下程序: #include iostream using namespace std; class Point public: static int number; public: Po
4、intonumber+; Point()number-; ; int Point: number-0: void mainO Point *ptr; PointA, B: Point* ptr_point=new Point3; ptx=ptr_point; Point C; Gout+Point: number+endl; deleteptr; 运行时输出的结果是 ( )。 ( A) 3 ( B) 4 ( C) 6 ( D) 7 9 下列情况中,不会调用拷贝构造函数的是 ( )。 ( A)用一个对象去初始化同一类的另一个新对象时 ( B)将类的一个对象赋值给该类的另一个对象时 ( C)函数的
5、形参是类的对象,调用函数进行形参和实参结合时 ( D)函数的返回值是类的对象,函数执行返回调用时 10 对于一个类定义,下列叙述中错误的是 ( )。 ( A)如果没有定义拷贝构造函数,编译器将生成一个拷贝构造函数 ( B)如果没有定义缺省的构造函数,编译器将一定生成一个缺省的构造函数 ( C)如果没有定义构造函数,编译器将生成一个缺省的构造函数和一个拷贝构造函数 ( D)如果已经定义了构造函数和拷贝构造函数,编译器不会生成任何构造函数 11 有如下类定义: class MyClass Int value; public; MyClass(int n): value(n) int gerValu
6、e()constreturn value; ; 则类 MyClass的构造函数的个数是 ( )。 ( A) 1个 ( B) 2个 ( C) 3个 ( D) 4个 12 有如下程序: include iOstream using namespace std; class MyClass public: MyClass(int i=0)cout 1; MyClass(const MyClass&x)cout 2; MyClass& operator=(const MyClass&x)cout 3; return*this; MyClass()cout 4; ; int main() MyClass
7、 obj1(1), obj2(2), obj3(obj1); return 0: 运行时的输出结果是 ( )。 ( A) 112444 ( B) 11114444 ( C) 121444 ( D) 11314444 13 Sample是一个类,执行下面语句后,调用 Sample类的构造函数的次数是 ( )。 Sample a2, *P=new Sample; ( A) 0 ( B) 1 ( C) 2 ( D) 3 14 有如下程序 #include iostream using namespace std; class Test public: Test() Test(const Test&
8、t)cout 1; ; Test fun(Test&u)Test t=u; return t; int main()Test x, y; x=fun(y); return 0; 运行这个程序的输出结果是 ( )。 ( A)无输出 ( B) 1 ( C) 11 ( D) 111 15 有如下程序: #include 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
9、d1(2), d2(3); cout d1 get()+d2 get()+XA: b endl; return 0; 运行时的输出结果是 ( )。 ( A) 5 ( B) 6 ( C) 7 ( D) 8 16 若 PAT是一个类,则程序运行时,语句 “PAT*ad3; ”调用 PAT的构造函数的次数是 ( )。 ( A) 0 ( B) 1 ( C) 2 ( D) 3 17 下列关于类成员对象构造函数调用顺序的叙述中,正确的是 ( )。 ( A)与它们在初始化列表中的顺序相同 ( B)与它们在类中声明的顺序相同 ( C)与析构函数的调用顺序相同 ( D)顺序不确定 18 有如下头文件: int
10、f1(); static int f2(); class MA public: int f3(); static int f4(); ; 在所描述的函数中,具有隐含的 this指针的是 ( )。 ( A) f1 ( B) f2 ( C) f3 ( D) f4 19 有如下程序: #include iostream using namespace std; class Test public: Test()n+=2; Test0n-=3; , static int getNum()return n; private: static int n; ; int Test: n=1; int main
11、() Test* p=new Test; delete p; cout “n=“ Test: getNum() endl; return 0; 执行后的输出结果是 ( )。 ( A) n=0 ( B) n=1 ( C) n=2 ( D) n=3 20 有如下类定义: class Point private; static int how_many; ; _how_many=0; 要初始化 Point类的静态成员 how_many,下划线处应填入的内容是 ( )。 ( A) ing ( B) static int ( C) int Point: ( D) static int Point: 21
12、 有如下类定义: class Sample public; Sample(int x): ref(x) private: Sample(): ref(0) static int val=5; const int ref; ; 上述程序段中,错误的语句是 ( )。 ( A) ( B) ( C) ( D) 22 由于常对象不能被更新,因此 ( )。 ( A)通过常对象只能调用它的常成员函数 ( B)通过常对象只能调用静态成员函数 ( C)常对象的成员都是常成员 ( D)通过常对象可以调用任何不改变对象值的成员函数 23 有如下程序: #include iostream using namespac
13、e 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(20); obj1 Print();语句 1 obj2 Print();语句 2 obj1 Set(20);语句 3 obj2 Set(30);语句 4 return 0; 其主函数中错误的语句是 ( )。 ( A)语句 1 ( B)语句 2
14、( C)语句 3 ( D)语句 4 24 有如下程序: #include iostream 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(); return 0; 运行时的输出结果是 ( )。 ( A)
15、 P8-E4 ( B) P8-C16- ( C) P0-E4- ( D) P0-C16- 25 已知函数 print()没有返回值,如果在类中将之声明为常成员函数,正确的是( )。 ( A) void print() const; ( B) const void print(); ( C) void const print(); ( D) void print(const); 26 有如下程序: #include iostream using namespace std; class Sample friend long fun(Sample s); public: Sample(long a
16、)x=a; private: ; long fun(Sample s) if(s x 2)return 1: return s X*fun(Sample(s x-1): int main() int sum=0; for(int i=0; i 6; i+)sum+=fun(Sample(i); return 0; 运行时输出的结果是 ( )。 ( A) 120 ( B) 16 ( C) 154 ( D) 34 27 已知类 MyClass声明如下: class MyClass int n; public: MyClass(int k): n(k) int getValue()constretu
17、rn n; ; 在下列数组定义中正确的是 ( )。 ( A) MyClass x12; ( B) MyClass x22=new MyClass(1), new MyClass(2); ( C) MyClass *x32; ( D) MyClass *x42=MyClass(1), MyClass(2); 国家二级 C+机试(类和对象)模拟试卷 4答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 此题考查的是类的定义。 C+语言规定,在类体内不允许对所定义的数据成员进行初始化。 【知识模块】 类和对象 2 【正确答案】 B 【试题解析】 此题考查的是类的访问权限 。在 C+语言中,类
18、的访问权限有公有、保护和私有三种。故本题选 B。 【知识模块】 类和对象 3 【正确答案】 B 【试题解析】 此题考查的是类成员的有关概念。类的友元函数可以直接访问该类的所有成员,但它不是类的成员函数,故选项 A错误;类成员函数的访问权限可以声明为公有、保护、私有,故选项 C错误:静态数据成员的声明是使用关键字 static,它可以是常成员,故选项 D错误。 【知识模块】 类和对象 4 【正确答案】 C 【试题解析】 在定义类的数据成员时,类中的数据成员可以是任意 类型,包括整型、浮点型、字符符型、数组、指针和引用等,也可以是对象。但是要注意,只有另外一个类的对象,才可以作为该类的成员,即作为
19、类的成员对象存在。自身类的对象是不可以作为自身类的成员存在,但自身类的指针可以。对于本题,在定义类 BB时,不能包括其对象 v3。 【知识模块】 类和对象 5 【正确答案】 C 【试题解析】 类的成员初始化顺序与成员变量在构造函数中的位置先后顺序无关,只与成员变量在类中定义的先后顺序有关。 【知识模块】 类和对象 6 【正确答案】 B 【试题解析】 建 立一个类的对象时,编译程序需要为对象分配存储空间,进行必要的初始化。在 C+中,这项工作是由构造函数来完成。 【知识模块】 类和对象 7 【正确答案】 C 【试题解析】 建立对象时根据给定的参数调用相应的构造函数对对象进行初始化。无参数时表示调
20、用缺省构造函数。构造函数在对象被创建时由系统自动调用。 【知识模块】 类和对象 8 【正确答案】 C 【试题解析】 此题是静态成员、对象的构造和对象的生存期等知识点的综合考查。此题定义了一个静态成员变量 number,初始值为 0。主函数中 第 2行定义了2个 Point对象,此时 number变为 2;随后 new运算符又定义了一个包含 3个Point对象元素的数组,其通过 delete结束后 number的值变为 5;然后又定义了一个 Point对象 C, number变为 6;最后输出 number的内容。 【知识模块】 类和对象 9 【正确答案】 B 【试题解析】 此题考查的是复制构造
21、函数的概念。用一个已知的对象初始化一个正在创建的同类对象时,就会发生复制构造函数。因此,选项 A、 C、 D均会调用复制构造函数,而只有选项 B没有创建的动作,不调用复制构造 函数。 【知识模块】 类和对象 10 【正确答案】 B 【试题解析】 此题考查的是构造函数。如果一个类中没有定义任何构造函数,编译器将生成一个不带参数的公有缺省构造函数。但只要定义了一个任意的构造函数,就不会生成缺省构造函数了。 【知识模块】 类和对象 11 【正确答案】 A 【试题解析】 此题考查的是构造函数的概念。构造函数的名字必须与类名相同;构造函数不指定返回值类型;构造函数可以重载;在创建对象时,系统会自动调用构
22、造函数。 【知识模块】 类和对象 12 【正确 答案】 A 【试题解析】 当创建 MyClass类对象 obj1(1)和 obj2(2)时候,调用类构造函数会输出两个 1,然后创建类对象 obj3(obj(1)时,会调用拷贝类构造函数,输出一个2。然后当 main函数结束时候,调用三个对象的析构函数会输出三个 4。 【知识模块】 类和对象 13 【正确答案】 D 【试题解析】 在 C+中,声明一个类对象时,编译程序需要调用类的构造函数为对象分配存储空间,进行必须的初始化。在本题的这条语句中,声明了一个Sample类型的包含 2个数组元素的数组 a2,一个指向类 Sample对象的指针 P,所以
23、 Sample类的构造函数共调用了 3次。 【知识模块】 类和对象 14 【正确答案】 C 【试题解析】 在类 Test中定义拷贝构造函数 Test(const Test &t),其函数体为输出 1,在主函数 main中,当执行语句 x=fun(y),调用拷贝函数用对象 y的值构造对象 u,输出 1,在执行函数 fun()的 return语句时,调用拷贝函数构造匿名对象,输出 1。 【知识模块】 类和对象 15 【正确答案】 C 【试题解析】 执行 XA类的 实例变量 d1(2)时,成员函数 d1 get()的返回值等于2, XA b的值等于 1,执行 XA类的实例变量 d2(3)时,成员函数
24、 d1 get()的返回值等于 3, XA b的值等于 2,所以输出结果为 2+3+2=7。 【知识模块】 类和对象 16 【正确答案】 A 【试题解析】 语句 “PAT(*ad)3”定义了含有 3个元素的指向类 PAT类型的指针数组 ad。 【知识模块】 类和对象 17 【正确答案】 B 【试题解析】 类成员对象构造函数的调用是按照在类中定义的顺序进行的,而不是按照 构造函数说明后的冒号顺序进行构造的。 【知识模块】 类和对象 18 【正确答案】 C 【试题解析】 此题考查的是 this指针。 this指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确地表示出了成员函数当前操作的
25、数据所属的对象。题目电,只有 f3()满足 “类的非静态成员函数 ”的要求,故应选 C选项。 【知识模块】 类和对象 19 【正确答案】 A 【试题解析】 此题考查的是静态数据成员和静态成员函数。静态数据成员是类中所有对象共享的成员,而不是某个对象的成员。题目中的 静态数据成员 n的运算具有叠加性,执行 “n+=2”和 “n-=3”后 n的值为 0。 【知识模块】 类和对象 20 【正确答案】 C 【试题解析】 此题考查的是静态数据成员的初始化。静态数据成员应在类体外进行初始化,且初始化的一般格式为:数据类型类名:静态数据成员名 =初始值。 【知识模块】 类和对象 21 【正确答案】 C 【试
26、题解析】 静态整型数据不能定义为类的数据成员。 【知识模块】 类和对象 22 【正确答案】 A 【试题解析】 此题考查的是常对象与常成员函数 的概念。使用 const关键字修饰的对象称为常对象,它不能被更新,所以常对象只能调用常成员函数而不能调用其它成员函数:使用 const关键字声明的成员函数是常成员函数,它也不能被更新,常成员函数只能调用常成员函数而不能调用其它函数。 【知识模块】 类和对象 23 【正确答案】 C 【试题解析】 在创建类对象 obj1(10)时,前面有关键字 const,所以当语句 3调用 obi1的成员函数试图修改其私有成员的数值的时候,会编译出错。 【知识模块】 类和
27、对象 24 【正确答案】 D 【试 题解析】 在主函数中创建 a1对象时,调用类 A的默认构造函数,其数据成员 r1的值等于 0。当执行 a1 print(2)语句时,调用带参数的 print成员函数,所以输出结果为 p0-,对象 a2为常成员,所以其成员变量 r1的值等于 4,因为常对象只能调用常成员函数,所以当执行语句 a2 print()语句时,输出结果为 C14-。 【知识模块】 类和对象 25 【正确答案】 A 【试题解析】 eonst成员函数表示该成员函数只能读类数据成员,而不能修改类成员数据。定义 const成员函数时,把 const关键字 放在函数的参数表和函数体之间。 【知识
28、模块】 类和对象 26 【正确答案】 C 【试题解析】 此题考查的是友元函数和递归函数。因为 fun函数是 Sample类的友元函数,所以 fun函数可以直接访问 Sample类对象的私有成员 x。主函数调用fun函数,构造参数为 0 5。当 n小于 2时, fun函数返回 1,其余返回值为n*fun(n-1)。 n取 0 5的值时 fun(n)依次为 1, 1, 2, 6, 24, 120,累加结果为154。 【知识模块】 类和对象 27 【正确答案】 C 【试题解析】 考 查的是对象数组。选项 A中在建立对象数组时也同样需要调用构造函数:选项 B和 D的类型不匹配, B中不能将指针传给非指针, D中是将非指针传给指针。 【知识模块】 类和对象