1、国家二级 C+机试(类和对象)模拟试卷 17及答案与解析 一、选择题 1 有如下头文件: int fl(); static int f2(); c1ass MA public: int f3(); static int f4(); ; 在所描述的函数中,具有隐含的 this指针的是 ( )。 ( A) f1 ( B) f2 ( C) f3 ( D) f4 2 下列程序段中包含 4个函数。其中具有隐含 this指针的是 ( )。 int funl(); c1ass Test public: int fun2(); friend intfun3(); static int fun4(); ( A)
2、 funl ( B) fun2 ( C) fun3 ( D) fun4 3 下列关于 this指针的描述中,正确的是 ( )。 ( A)类的成员函数都有 this指针 ( B)类的友元函数都有 this指针 ( C)任何与类相关的函数都有 this指针 ( D)类的非静态成员函数都有 this指针 4 有如下程序: #inc1ude iostream using namespacestd; c1ass Test public: TestO n+=2; Test0n=3; static int getNum0 return n; private: static int n; ; int Test
3、:n=1; int main() Test* p=new Test; delete p; cout “n=“ Test:getNumO end1; retum 0; 执行后的输出结果是 ( )。 ( A) n=0 ( B) n=1 ( C) n=2 ( D) n=3 5 有如下程序: #inc1ude iostream using ruunespace std; c1ass Obj static int i; public: Obj()i+ Obj()i; static int getVal()return i; ; int Obj:i=0; void f()Obj ob2; cout ob2
4、 getVal(); int main() Obj obl; f(); Obj *ob3= new Obj; cout ob3 getVal(); delete ob3; cOut Obj:getVal(); retutn 0; 程序的输出结果是 ( )。 ( A) 232 ( B) 231 ( C) 222 ( D) 221 6 有如下程序: #inc1ude iostream using namespace std; c1ass MyClass public: MyClass()+count;) MyClass()count;) static int getCount()retum cou
5、nt; private: static int count; ; intMyClass:count0; int main0 MyClass obj; cout obj getCounto; MyClass*ptr=new MyClass; cout MyClass:getCount0; delete ptr; cout MyClass:getCount(); return 0; 程序的输出结果是 ( )。 ( A) 121 ( B) 232 ( C) 221 ( D) 122 7 有如下类定义: c1ass Point private; static int how many; ; _how
6、many=0; 要初始化 Point类的静态成员 how_many,下划线处应填入的内容是 ( )。 ( A) ing ( B) static int ( C) int Point: ( D) static int Point: 8 有如下类和对象的定义: c1ass Constants public; static double getPIO retum 3 1416;) ; Constants constants, 下列各组语句中,能输出 3 1416的是 ( )。 ( A) cout constants getPI();和 cout Constants:gerPI(); ( B) cou
7、t constants getPI();和 cout Constants getPI(); ( C) cout constants getPI();和 cout Constants getPI(); ( D) cout constants getPI();和 cout Constants:getPI(); 9 若 AA为一个类, a为该类的非静态数据成员,在该类的一个成员函数定义中访问 a时,其书写格式为 ( )。 ( A) a ( B) AA a ( C) a ( D) AA:a 10 有如下类定义: c1ass Samp1e public; Samp1e(int x): ref(x) pr
8、ivate: Samp1e():ref(0) static int val=5; const int ref; ; 上述程序段中,错误的语句是 ( )。 ( A) ( B) ( C) ( D) 11 已知类 Myc1ass的定义如下 c1ass MyClass public: void functionl (MyClass static void function2(MyClass void function3()cout data; staric void function4()cout data; private: int data; ; 其中有编译错误的函数是 ( )。 ( A) fun
9、ctionl ( B) function2 ( C) function3 ( D) function4 12 有如下程序: #inc1ude iostream using namespace std; c1ass XA int a; puolic: static int b; XA(int aa):a(aa)b+; int getA()retum a; ; int XA:b=0; int main0 XA d1(4),d2(5); cout d1 getA()+d2 getA()+XA:b+d1 b end1; return 0: 运行这个程序的输出结果是 ( )。 ( A) 9 ( B) 1
10、1 ( C) 13 ( D) 15 13 由于常对象不能被更新,因此 ( )。 ( A)通过常对象只能调用它的常成员函数 ( B)通过常对象只能调用静态成员函数 ( C)常对象的成员都是常成员 ( D)通过常对象可以调用任何不改变对象值的成员函数 14 有如下程序 #inc1ude iostream using namespace std; int i=1; c1ass Fun public: static int i; int value()return il, int value( )const return i+1; ; int Fun:1=2; int main() int i=3;
11、Fun funl; const Fun fun2; retum 0; 若程序的输出结果是: 123 则程序中下划线处遗漏的语句是 ( )。 ( A) cout funl value() Fun:i fun2 value(); ( B) cout Fun:i funl value() fun2 value(); ( C) cout funl value() fun2 value() Fun:i; ( D) cout fun2 value() Fun:i funl value(); 15 有如下程序: #inc1ude iostream using namespace std; c1ass VAC
12、 public; int f()constreturn 3; int f()return 5; ; Int main() VAC vl; const VAC v2; cout vl f v2 f(); fetum 0; 运行时的输出结果是 ( )。 ( A) 53 ( B) 35 ( C) 55 ( D) 33 16 有如下程序: #inc1ude iostream using namespace std; c1ass MyClass public: MyClass(int x):val(x) void Set(int x)val=x; void Print()constcout “val=“
13、 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 ( C)语句 3 ( D)语句 4 17 有如下类定义和变量定义: c1ass A public: A()data=0; A() int GetData()const retum data; vo
14、id SetData (int n) data=n; private: int data; ; const A a; A b; 下列函数调用中错误的是 ( )。 ( A) a GetData(); ( B) a SetData(10); ( C) b GetData(); ( D) b SetData(10); 18 有如下程序: #inc1ude iostream using namespace std; c1ass A public: A(int i): rl(i) void print0 cout E r1 ;) void print() const cout Ck r1*rl ;) p
15、rivate: int r1, ; int main() A a1(2); const A a2(4); al print(); a2 print(); return 0; 运行时的输出结果是 ( )。 ( A)运行时出错 ( B) E2C16 ( C) C4C16 ( D) E2E4 19 有如下程序: #inc1ude iostream using namespace std; c1ass A public: A(int i=0):rl(i) void print()cout E rl ;) void print()const cout Ck rl*rl ; void print(int
16、x)cout “pk rl*rl*rl ; private: int r1, ; int main() A a1; const A a2(4); al print(2); a2 print(); returnO; 运行时的输出结果是 ( )。 ( A) P8E4 ( B) P8C16 ( C) P0E4 ( D) P0C16 20 某类中有一个无参且无返回值的常成员函数 Show,则正确的 Show函数原型是( )。 ( A) const void Show(); ( B) void const Show(); ( C) void Show()const; ( D) void Show(con
17、st); 21 已知类 IMS中两个成员函数的声明为 “void listeno const;”与 “void speak();”,另有两个对象的定义为 “IMS obj1;”与 “cortst IMS obj2;”,则下列语 句中,产生编译错误的是 ( )。 ( A) objl listen(); ( B) objl speak(); ( C) obj2 listen(); ( D) obj2 speak(); 22 已知函数 print()没有返回值,如果在类中将之声明为常成员函数,正确的是( )。 ( A) void print()const; ( B) const void print
18、(); ( C) void const print(); ( D) voidprint(const); 23 有如下类定义: c1ass Test char a; const charb; public: Test(charc)a=c;b=c;第 1行 void f(char a)const this a=a;) 第 2行 void g(charb)this b=b; 第 3行 char ho constreturn a; 第 4行 ; 编译时没有错误的行是 ( )。 ( A)第 1行 ( B)第 2行 ( C)第 3行 ( D)第 4行 24 有如下类定义: c1ass AA int a;
19、public: int getRef()const retum int getValue()const retuma; void set(int n)const a=n; friend void show(AA aa)const cout a; ; 其中的四个函数定义中正确的是 ( )。 ( A) ( B) ( C) ( D) 25 有如下程序: #inc1ude iostream using namespace std; c1ass Samp1e friend long fun (Samp1e s); public: Samp1e (long a)x=a; private: long x;
20、); long fun (Samp1e s) if (s x 2)return 1: return s x*fun(Samp1e(s x1): int main() int sum=0; for(int 1=0; 1 6; 1+)sum+=fun(Samp1e(i); cout sum, return O; 运行时输出的结果是 ( )。 ( A) 120 ( B) 16 ( C) 154 ( D) 34 26 有如下 程序: #inc1ude iostream #inc1ude cmath using std:cout; c1ass Point public: friend double di
21、stance(const Point /p距原点的距离 Point(int xx=0, int yy=0): x(xx), y(yy) private: int x, y; ; double distance(const Point int main() Point p1(3,4); cout distance(p1); return 0; 下列叙述中正确的是 ( )。 ( A)程序编译正确 ( B)程序编译时语句 出错 ( C)程序编译时语句 出错 ( D)程序编译时语句 出错 27 有如下程序: #inc1ude iostream using namespace std; c1ass Bo
22、at; c1ass Car public: Car(int i):weight(i) friend int Total(const Car private: int weight; ; c1ass Boat public: Boat(int i):weight(i) friend int Total(const Car private: int weight; ; int Total(const Car int main0 Car c(10), Boat b(8); cout “The totalweightis “ Total(c,b) end1; returnO; 下列关于程序的描述中,正
23、确的是 ( )。 ( A)程序编译正确 ( B)程序编译时语句 出错 ( C)程序编译时语句 出错 ( D)程序编译时语句 出错 28 已知类 MyClass声明如下: c1ass MyClass int n: public: MyClass(int k):n(k) int getValue()const return n; ) ; 在下列数 组定义中正确的是 ( )。 ( A) MyClass x12; ( B) MyClass x22=neW MyClass(1),neW MyClass(2); ( C) MyClass *x32; ( D) MyClass *x42=MyClass(1)
24、,MyClass(2); 29 已知类 Myc1ass的定义如下: c1ass MyClass public: MyClass(int d)data=d; MyClass() priVate: int data; ; 下列对 Myc1ass类对象数组的定义和初始化语句中,正确的是 ( )。 ( A) MyClass arrays2; ( B) MyClass arrays2=MyClass(5); ( C) MyClass arrays2=MyClass(5),MyClass(6); ( D) MyClass*a* ays=new MyClass2; 国家二级 C+机试(类和对象)模拟试卷 1
25、7答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 此题考查的是 this指针。 tlus指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确地表示出了成员函数当前操作的数据所属的对象。题目中,只有 f3()满足 “类的菲静态成员函数 ”的要求,故应选 C选项。 【知识模块】 类和对象 2 【正确答案】 B 【试题解析】 this指针是成员函数所属对象的指针,它指向类对象的地址。成员函数通过这个指针知道自己属于哪一个对象。 this指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确的地表示出了成员函数当前操作 的数据所属的对象。 【知识模块】 类和对象 3 【正
26、确答案】 D 【试题解析】 this是成员函数所属对象的指针,它指向类对象的地址。成员函数通过这个指针可以知道自己属于哪一个对象。它隐藏于每个类的非静态成员函数中。 【知识模块】 类和对象 4 【正确答案】 A 【试题解析】 此题考查的是静态数据成员和静态成员函数。静态数据成员是类中所有对象共享的成员,而不是某个对象的成员。题目中的静态数据成员 n的运算具有叠加性,执行 “n+2”和 “n3”后 n的值为 0。 【知识模块 】 类和对象 5 【正确答案】 D 【试题解析】 此题考查的是静态成员。本题中, Obj类定义了一个静态数据成员i,并初始化为 0在主函数中,首先定义了 1个该类对象 ob
27、l,所以构造函数被调用 1次, i加 1;然后调用函数 f0,该函数中又定义了一个对象 ob2,此时 j再次加 1变为 2,然后通过函数 getVal0输出 i的值 2。 f()函数结束, ob2变量被释放,故析构函数被调用了 1次, i变成 1:回到主函数中,又动态创建了 1个对象并让ob3指向它,此后 i变成 2并输出。最后释放动态创建的对象 i变为 l,输出 1。故最终的 输出结果是 221。 【知识模块】 类和对象 6 【正确答案】 A 【试题解析】 此题考查的是静态成员。静态成员的特性是不管这个类创建了多少对象,它的静态成员都只有一个拷贝副本,这个副本被所有属于这个类的对象共享。题目
28、中,首先定义了 obj对象,其构造函数使静态数据成员 count增 l,故输出 “1”;然后通过指针动态创建了 MyClass类的对象,构造函数被再次调用,count变为 2,输出 “2”;接着删除创建的 MyClass类的对象,调用析构函数,count减 1变为 1,输出 “1”。故最终输出结果是 121。 【知识模块】 类和对象 7 【正确答案】 C 【试题解析】 此题考查的是静态数据成员的初始化。静态数据成员应在类体外进行初始化,且初始化的一般格式为:数据类型类名:静态数据成员名 =初始值。 【知识模块】 类和对象 8 【正确答案】 D 【试题解析】 此题考查的是静态成员函数的引用。 g
29、etPI()是类 Constan ts的静态成员函数。引用静态成员函数可以有两种形式:一是通过类名直接进行调用,例如类名:静态成员函数名:另一种是用类的任何对象名进行调用其作用仅是通过对 象名间接的指出类名,例如 constants getPI()选项 D即是这种调用方式。 【知识模块】 类和对象 9 【正确答案】 A 【试题解析】 类 AA的成员函数直接引用类 AA的非静态数据成员。 【知识模块】 类和对象 10 【正确答案】 C 【试题解析】 静态整型数据不能定义为类的数据成员。 【知识模块】 类和对象 11 【正确答案】 D 【试题解析】 funcyion4()函数作为类的静态成员函数,
30、不能直接访问类中说明的非静态成员,即 cout data在编 译时会出错。 【知识模块】 类和对象 12 【正确答案】 C 【试题解析】 在类 XA的构造函数中,定义了用成员变量 a的值初始化变量 aa,同时静态成员变量 b值加 1。所以当在主 main函数中定义类 XA的对象 d1(4)后,变量 b的等于 1,定义对象 d2(5)后,变量 b的值等于 2,所以表达式dl getA()+d2 getAo+XA:b+dl b等于 4+5+1+2+1=13 【知识模块】 类和对象 13 【正确答案】 A 【试题解析】 此题考查的是常对象与常成员函数的概念。使用 const关键字修饰的对象称为常对象
31、,它不能被更新,所以常对象只能调用常成员函数而不能调用其它成员函数:使用 const关键字声明的成员函数是常成员函数,它也不能被更新,常成员函数只能调用常成员函数而不能调用其它函数。 【知识模块】 类和对象 14 【正确答案】 A 【试题解析】 此题考查的是常成员函数。 Const关键字可以用于参与重载函数的区分,此时常对象调用常成员函数,一般对象调用一般成员函数,当类中只有一个常成员函数时,一般对象也可以调用该常成员函数。本题中,通过 fun1调用value()函 数时,是调用前一个,而通过 fun2调用 value()函数是调用后一个:另外, value()函数中访问的 i是类中定义的数据
32、成员 i,全局变量 i在类中被 “屏蔽 ”。 fun1 value()输出 11=21=1; fun2 value()调用后一个 value()函数输出i+1=2+1=3;Fun:i是通过类名直接访问类的静态数据成员 i的值,即 2;所以正确的输出顺序是 A选项。 【知识模块】 类和对象 15 【正确答案】 A 【试题解析】 此题考查的是常成员函数的应用。 VAC类中说明了两个函数,一个是 常成员函数,一个是普通函数;在主函数中说明了两个对象,通过普通对象v1调用的是普通函数,输出 5;通过常对象 V2调用的是常成员函数,输出 3。 【知识模块】 类和对象 16 【正确答案】 C 【试题解析】
33、 在创建类对象 obj l(10)时,前面有关键字 const,所以当语句 3调用 objl的成员函数试图修改其私有成员的数值的时候,会编译出错。 【知识模块】 类和对象 17 【正确答案】 B 【试题解析】 由题意可知 a为常对象,因为常对象不能被更新,所以通过这个常对象只能调用它的常成 员函数 GetData(),而不能调用其他成员函数 SetData(10),因而选项 B为本题的正确答案。 【知识模块】 类和对象 18 【正确答案】 B 【试题解析】 类 A包括一个整型数据成员 r1,一个一般成员函数 print(),一个常成员函数 print() const。在主函数中定义了对象 a1
34、,并对 r1的值赋 2和常对象a2,并对 r1的值赋 4,在 C+中,常对象不能被更新,所以常对象只能调用类的常成员函数,而不能调用一般成员函数。而一般的对象,既可以调用一般成员函数也可以调用常成员函数。所以在本 题中,当执行 al print()时,输出为 E2,执行 a2 print0时,输出为 C16。 【知识模块】 类和对象 19 【正确答案】 D 【试题解析】 在主函数中创建 al对象时,调用类 A的默认构造函数,其数据成员 r1的值等于 O。当执行 al print(2)语句时,调用带参数的 print成员函数,所以输出结果为 p0,对象 a2为常成员,所以其成员变量 r1的值等于
35、 4,因为常对象只能调用常成员函数,所以当执行语句 a2 print()语句时,输出结果为C14。 【知识模块】 类和对象 20 【正确答案】 C 【试题解析】 常成员函数的说明格式如下:返回类型 成员函数名 (参数表 )const;,所以对于本题来说无参且无返回值的常成员函数 show,其正确的函数原型是选项 C)。 【知识模块】 类和对象 21 【正确答案】 D 【试题解析】 函数 listen()作为类 IMS的常成员函数,一般对象 objl和常对象obj2都可以调用它,而函数 speak()作为 IMS的一般成员函数,则只有一般对象objl可以调用,而常对象 obj2调用会产生编译错误
36、。 【知识模块】 类和对象 22 【正确答案】 A 【试题解析】 Const成员函数表示该成员函数只能读类数据成员,而不能修改类成员数据。定义 const成员函数时,把 const关键字放在函数的参数表和函数体之间。 【知识模块】 类和对象 23 【正确答案】 D 【试题解析】 类 Test中的常成员函数 h0返回数据成员 a的值。 【知识模块】 类和对象 24 【正确答案】 B 【试题解析】 此题考查了常成员函数和友元函数的概念。选项 A中, getRef()函数的返回值和函数函数类型不符,故错 误; C选项中 set()常成员函数改变了数据成员的值,这是不允许的; D选项中 show()函
37、数被同时定义成友元函数和常成员函数是错误的。 【知识模块】 类和对象 25 【正确答案】 C 【试题解析】 此题考查的是友元函数和递归函数。因为 fun函数是 Samp1e类的友元函数,所以 fun函数可以直接访问 Samp1e类对象的私有成员 x。主函数调用fun函数,构造参数为 0 5。当 n小于 2时, fun函数返回 1,其余返回值为n*fun(nl)。 n取 05的值时 fun(n)依次为 1, 1, 2, 6, 24, 120,累加结果为154。 【知识模块】 类和对象 26 【正确答案】 A 【试题解析】 这段程序是正确的,计算 p距离原点的距离。语句 是类 Point的构造函数
38、,在构造函数中给变量 xx和 yy赋初值 0。语句 是计算点 p距原点的距离的函数 distance。语句 是计算点 p1距离原点的距离并输出。 【知识模块】 类和对象 27 【正确答案】 A 【试题解析】 程序中定义了类 Car和类 Boat,在两个类中分别定义他们的构造函数和友元函数 friend。程序在 VC6 0中编译通过。 【知 识模块】 类和对象 28 【正确答案】 C 【试题解析】 考查的是对象数组。选项 A中在建立对象数组时也同样需要调用构造函数;选项 B和 D的类型不匹配, B中不能将指针传给非指针, D中是将非指针传给指针。 【知识模块】 类和对象 29 【正确答案】 C 【试题解析】 在选项 C)中定义了类 MyClass对象数组 arrays2,并用对象MyClass(5)和 MyClass(6)对这个数组中的两个元素赋初值。 【知识模块】 类和对象