1、国家二级 C+机试(类和对象)模拟试卷 10及答案与解析 一、选择题 1 有如下类定义: class Foo public: Foo(int v): value(v) Foo() private: Foo() 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 AA v1, *v2; BB v3: int*v4; ; 其中有一个成员变 量的定义是错误的,这个变量是 ( )。 ( A) vl ( 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 using namespace std; class Point public: static int number; public: Pointonumber+;
4、Point()number-; ; int Point: number-0: void main() 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 gerValue()constretu
6、rn value; ; 则类 MyClass的构造函数的个 数是 ( )。 ( A) 1个 ( B) 2个 ( C) 3个 ( D) 4个 12 有如下程序: #include using namespace std: class MyClass public: MyClass(int i=0)tout using namespace std; class Test public: Test() Test(const Test&t)cout using namespace std; class XA int a; public: static int b; XA(int aa): a(aa)b
7、+; XA() int get()return a; ) ; hat XA: b=0; int main() XA d1(2), d2(3); cout using namespace std; class Test public: Test() n+=2; Test() n-=3; static int getNum()return n; private: static int n; ; int Test: n=1; int main() Test*p=new Test; delete p; cout using namespace std; class MyClass public: My
8、Class(int x): Val(x) void Set(int x)val=x; void Print()constcout using namespace std; class A public: A(int i=0): r1(i) void print()cout 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 x 2)return 1: return s x*fun(Sam
9、ple(s x-1): int main() int sum=0; for(int i=0; i6; i+)sum+=fun(Sample(i); coutsum; return 0; 运行时输出的结果是 ( )。 ( A) 120 ( B) 16 ( C) 154 ( D) 34 27 己知类 MyClass声明如下: class MyClass int n; public: MyClass(int k): n(k) int getValue()const return n; ; 在下列数组定义中正确的是 ( )。 ( A) MyClass x12; ( B) MyClass x22=new
10、 MyClass(1), new MyClass(2); ( C) MyClass*x32; ( D) MyClass*x42=MyClass(1), MyClass(2); 国家二级 C+机试(类和对象)模拟试卷 10答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 此题考查的是类的定义。 C+语言规定,在类体内不允许对所定义的数据成员进行初始化。 【知识模块】 类和对象 2 【正确答案】 B 【试题解析】 此题考查的是类的访问权限。在 C+语言中,类的访问权限有公有、保护和私有三种。故本题选 B。 【知识模块】 类和对象 3 【正确答案】 B 【试题解析】 此题考查的是类成员的有
11、关概念。类的友 元函数可以直接访问该类的所有成员,但它不是类的成员函数,故选项 A错误;类成员函数的访问权限可以声明为公有、保护、私有,故选项 C错误;静态数据成员的声明是使用关键字static。它可以是常成员,故选项 D错误。 【知识模块】 类和对象 4 【正确答案】 C 【试题解析】 在定义类的数据成员时,类中的数据成员可以是任意类型,包括整型、浮点型、字符符型、数组、指针和引用等,也可以是对象。但是要注意,只有另外一个类的对象,才可以作为该类的成员,即作为类的成员对象存在。自身类的对象是不可以作为自身类的成 员存在,但自身类的指针可以。对于本题,在定义类 BB时,不能包括其对象 v3。
12、【知识模块】 类和对象 5 【正确答案】 C 【试题解析】 类的成员初始化顺序与成员变量在构造函数中的位置先后顺序无关,只与成员变量在类中定义的先后顺序有关。 【知识模块】 类和对象 6 【正确答案】 B 【试题解析】 建立一个类的对象时,编译程序需要为对象分配存储空间,进行必要的初始化。在 c+中,这项工作是由构造函数来完成。 【知识模块】 类和对象 7 【正确答案】 C 【试题解析 】 建立对象时根据给定的参数调用相应的构造函数对对象进行初始化。无参数时表示调用缺省构造函数。构造函数在对象被创建时由系统自动调用。 【知识模块】 类和对象 8 【正确答案】 C 【试题解析】 此题是静态成员、
13、对象的构造和对象的生存期等知识点的综合考查。此题定义了一个静态成员变量 number,初始值为 0。主函数中第 2行定义了2个 Point对象,此时 number变为 2;随后 new运算符又定义了一个包含 3个Point对象元素的数组,其通过 delete结束后 number的值变为 5;然后又定义了一个 Point对象 C, number变为 6;最后输出 number的内容。 【知识模块】 类和对象 9 【正确答案】 B 【试题解析】 此题考查的是复制构造函数的概念。用一个已知的对象初始化一个正在创建的同类对象时,就会发生复制构造函数。因此,选项 A、 C、 D均会调用复制构造函数,而只
14、有选项 B没有创建的动作,不调用复制构造函数。 【知识模块】 类和对象 10 【正确答案】 B 【试题解析】 此题考查的是构造函数。如果一个类中没有定义任何构造函数,编译器将生成一个不带参数的公有缺省构造函 数。但只要定义了一个任意的构造函数,就不会生成缺省构造函数了。 【知识模块】 类和对象 11 【正确答案】 A 【试题解析】 此题考查的是构造函数的概念。构造函数的名字必须与类名相同;构造函数不指定返回值类型;构造函数可以重载:在创建对象时,系统会自动调用构造函数。 【知识模块】 类和对象 12 【正确答案】 A 【试题解析】 当创建 MyClass类对象 obj1(1)和 obj2(2)
15、时候,调用类构造函数会输出两个 1,然后创建类对象 obj3(obj(1)时,会调用拷贝类构造函 数,输出一个2,然后当 main函数结束时候,调用三个对象的析构函数会输出三个 4。 【知识模块】 类和对象 13 【正确答案】 D 【试题解析】 在 C+中,声明一个类对象时,编译程序需要调用类的构造函数为对象分配存储空间,进行必须的初始化。在本题的这条语句中,声明了一个Sample类型的包含 2个数组元素的数组 a2,一个指向类 Sample对象的指针 P,所以 Sample类的构造函数共调用了 3次。 【知识模块】 类和对象 14 【正确答案】 C 【试题解析】 在类 Test中定义 拷贝构
16、造函数 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)时,成员函数 d1 get()的返回值等于 3, XA b的值等于 2,所以输出 结果为 2+3+2=7。 【知识模块】 类和对象 16 【正确答案
17、】 A 【试题解析】 语句 “PAT(*ad)3”定义了含有 3个元素的指向类 PAT类型的指针数组 ad。 【知识模块】 类和对象 17 【正确答案】 B 【试题解析】 类成员对象构造函数的调用是按照在类中定义的顺序进行的,而不是按照构造函数说明后的冒号顺序进行构造的。 【知识模块】 类和对象 18 【正确答案】 C 【试题解析】 此题考查的是 this指针。 this指针是一个隐含的指针,它隐含于每个 类的非静态成员函数中,它明确地表示出了成员函数当前操作的数据所属的对象。题目中,只有 f3()满足 “类的非静态成员函数 ”的要求,故应选 C选项。 【知识模块】 类和对象 19 【正确答案
18、】 A 【试题解析】 此题考查的是静态数据成员和静态成员函数。静态数据成员是类中所有对象共享的成员,而不是某个对象的成员。题目中的静态数据成员 n的运算具有叠加性,执行 “n+=2”和 “n-=3”后 n的值为 0。 【知识模块】 类和对象 20 【正确答案】 C 【试题解析】 此题考查的是静态数据成员的初 始化。静态数据成员应在类体外进行初始化,且初始化的一般格式为:数据类型类名:静态数据成员名 =初始值。 【知识模块】 类和对象 21 【正确答案】 C 【试题解析】 静态整型数据不能定义为类的数据成员。 【知识模块】 类和对象 22 【正确答案】 A 【试题解析】 此题考查的是常对象与常成
19、员函数的概念。使用 const关键字修饰的对象称为常对象,它不能被更新,所以常对象只能调用常成员函数而不能调用其它成员函数;使用 const关键字声明的成员函数是常成员函数,它也不能被更新,常成 员函数只能调用常成员函数而不能调用其它函数。 【知识模块】 类和对象 23 【正确答案】 C 【试题解析】 在创建类对象 obj1(10)时,前面有关键字 const,所以当语句 3调用 obj1的成员函数试图修改其私有成员的数值的时候,会编译出错。 【知识模块】 类和对象 24 【正确答案】 D 【试题解析】 在主函数中创建 a1对象时,调用类 A的默认构造函数,数据成员r1的值等于 0。当执行 a
20、1 print(2)语句时,调用带参数的 print成员函数,所以输出结果为 p0-,对象 a2为 常成员,所以其成员变量 r1的值等于 4,因为常对象只能调用常成员函数,所以当执行语句 a2 print()语句时,输出结果为 C14-。 【知识模块】 类和对象 25 【正确答案】 A 【试题解析】 const成员函数表示该成员函数只能读类数据成员,而不能修改类成员数据。定义 const成员函数时,把 const关键字放在函数的参数表和函数体之间。 【知识模块】 类和对象 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中是将非指针传给指针。 【知识模块】 类和对象