1、国家二级 C+机试(类和对象)模拟试卷 8及答案与解析 一、选择题 1 下列程序段中包含 4个函数。其中具有隐含 this指针的是 ( )。 int funl(); class Test public: int fun2(); friend int fun3(); static int fun4(); ( A) funl ( B) fun2 ( C) fun3 ( D) fun4 2 下列关于 this指针的描述中,正确的是 ( )。 ( A)类的成员函数都有 this指针 ( B)类的友元函数都有 this指针 ( C)任何与类相关的函数都有 this指针 ( D)类的非静态成员函数都有 t
2、his指针 3 有如下程序: #inc1ude iostream 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 “n=“ Test: getNum() endl; return 0; 执行后的输出结果是 ( )。 ( A) n=0 ( B) n=1 ( C) n=2 ( D) n=3
3、4 有如下程序: #inc1ude iostream using namespace std; class Obj static int i; public: Obj()i+; ) 一 Obj()i一一; ) static int getVal()return i; ) ; int Obj: i=0; void f()Obj ob2; cout ob2 getVal(); int main() Obj obl; f(); Obj *ob3=new Obj; cout ob3一 getVal(); delete ob3; cout Obj: getVal(); return 0; 程序的输出结果
4、是 ( )。 ( A) 232 ( B) 231 ( C) 222 ( D) 221 5 有如下程序: #inc1ude iostream using namespace std; class Myclass public: Myclass() +count; Myclass()一一 count; static int getCount() return count, private: static int count, ; int Myclass: count=0; int main() Myclass obj; cout obj getCount(); Myclass*ptr=new My
5、class; cout Myclass: getCount(); delete ptr; cout Myclass: getCount(); return 0; 程序的输出结果是 ( )。 ( A) 121 ( B) 232 ( C) 221 ( D) 122 6 有如下类定义: class Point private; static int how_many; ; _how_many=0; 要初始化 Point类的静态成员 how_many,下划线处应填入的内 容是 ( )。 ( A) ing ( B) staticint ( C) int Point: ( D) static int Po
6、int: 7 有如下类和对象的定义: class Constants public; static double getPI() return 3 1416; ; Constants constants, 下列各组语句中,能输出 3 1416的是 ( )。 ( A) cout constants一 getPI();和 cout Constants: gerPI(); ( B) cout constants getPI();和 cout Constants, getPI(); ( C) cout constants一 getPI();和 cout Constants一 getPI(); ( D)
7、 cout constants getPIO;和 cout Constants: getPI(); 8 若 AA为一个类, a为该类的非静态数据成员,在该类的一个成员函数定义中访问 a时,其书写格式为 ( )。 ( A) a ( B) AA, a ( C) a ( D) AA: a 9 有如下类定义: class Sample public; Sample(int x): ref(x) private: Sample(): ref(0) static int val=5; const int ref; ; 上述程序段中,错误的语句是 ( )。 ( A) ( B) ( C) ( D) 10 己知
8、类 Myclass的定义如下 class Myclass public: void functionl (Myclass c)cout c data; ) static void function2(Myclass&c)cout c data; void function3() cout data; staric void function4()cout data; private: int data; ; 其中有编译错误的函数是 ( )。 ( A) functionl ( B) function2 ( C) function3 ( D) function4 11 有如下程序: #inc1ud
9、e iostream using namespace std; class XA int a: public: static int b: XA(int aa): a(aa)b+; ) int getA() return a, ) ; int XA: b=0; int main() XA d1(4), d2(5); cout dl getA()+d2 getA()+XA: b+d1 b endl; return 0; 运行这个程序的输出结果是 ( )。 ( A) 9 ( B) 11 ( C) 13 ( D) 15 12 由于常对象不能被更新,因此 ( )。 ( A)通过常对象只能调用它的常成员
10、函数 ( B)通过常对象只能调用静态成员函数 ( C)常对象的成员 都是常成员 ( D)通过常对象可以调用任何不改变对象值的成员函数 13 有如下程序 #inc1ude iostream using namespace std; int i=1; class Fun public: static int i: int value()return i一 1; int value( )const return i+1; ; int Fun: i=2; int main() int i=3; Fun funl; const Fun fun2; return 0; 若程序的输出结果是: 123 则程序
11、中下划线处遗漏的语句是 ( )。 ( A) cout fun1 value() Fun: i fun2 value(); ( B) cout Fun: i fun1 value() fun2 value(); ( C) cout fun1 value() fun2 value() Fun: i; ( D) cout fun2 value() Fun: i fun1, value(); 14 有如下程序: #inc1ude iostream using namespace std; class VAC public; int f() constreturn 3; int f() return 5
12、; ); Int main() VAC vl; const VAC v2; cout V1 f() V2 fi(); feturn 0; ) 运行时的输出结果是 ( )。 ( A) 53 ( B) 35 ( C) 55 ( D) 33 15 有如下程序: #inc1ude iostream using namespace std; class Myclass public: Myclass(int x): val(x) void Set(int x)val=x; void Print()constcont “Val=“ Val t; ) private: int val, ; int main
13、() const Myclass obj1(10); Myclass obj2(20); obj 1 Print(); 语句 1 obj 2 Print(); 语句 2 obj1 Set(20);语句 3 obj2 Set(30); 语句 4 return 0; 其主函数中错误的语句是 ( )。 ( A)语句 1 ( B)语句 2 ( C)语句 3 ( D)语句 4 16 有如下类定义和变量定义: class A public: A()data=0; A() int GetData() const retum data; void SetData (int n) data=n; private
14、: int data; ; const A a; A b; 下列 函数调用中错误的是 ( )。 ( A) a GetData(); ( B) a SetData(10); ( C) b GetData(); ( D) b SetData(10); 17 有如下程序: #inc1ude iostream using namespace std; class A public: A(int i): rl(i) yoid print() cout E r1 _; void print() const cout C r1*rl 一 ; private: int r1, ; int main() A a
15、1(2); const A a2(4); a1 print(); a2 print(); return 0; 运行时的输出结果是 ( )。 ( A)运行时出错 ( B) E2一 C16一 ( C) C4一 C16一 ( D) E2一 E4一 18 有如下程序: #inc1ude iostream using namespace std; class A public: A(int i=0): rl(i) void print()cout E rl 一 ; voidprint() constcout C r1*rl 一 ; void print(int x)cout p r1*r 1*r1 一
16、; private: int r1, ; int main() A a1; const A a2(4); al print(2); a2 print(); rcturn 0; 运行时的输出结果是 ( )。 ( A) P8一 E4 ( B) P8一 C16一 ( C) P0一 E4一 ( D) P0一 C16一 19 某类中有一个无参且无返回值的常成员函数 Show,则正确的 Show函数原型是( )。 ( A) const void Show(); ( B) void const Show(); ( C) void Show() const; ( D) void Show(const); 20
17、 已知类 IMS中两个成员函数的声明为 “void listen() const; ”与 “void speak(); ”,另有两个对象的定义为 “IMS objl; ”与 “const IMS obj2;: ”,则下列语句中,产生编译错误的是 ( )。 ( A) objl listen(); ( B) objl speak(); ( C), obj2 listen(); ( D) obj2 speak(); 21 已知函数 print()没有返回值,如果在类中将之声明为常成员函数,正确的是( )。 ( A) void print() const; ( B) const void print(
18、); ( C) void const print(); ( D) voidprint(const); 22 有如下类定义: class Test char a; const char b; public: Test(char c)a=c; b=c; ) 第 1行 void f(char a)constthis一 a=a; ) 第 2行 void g(char b)this一 b=b; ) 第 3行 char ho constreturn a; 第 4行 ; 编译时没有错误的行是 ( )。 ( A)第 3行 ( B)第 4行 ( C)第 1行 ( D)第 2行 23 有如下类定义: class
19、AA int a; public: int getRef()const return &a, ) int getValue()const return a; ) void set(int n)const a=n; ) friend一 void show(AA aa)const cout a, ; 其中的四个函数定义中正确的是 ( )。 ( A) ( B) ( C) ( D) 24 有如下程序: #inc1ude iostream using namespace std; class Sample friend long fun (Sample s); public: Sample (long
20、a)x=a; pnvate: long x; ; long fun (Sample s) if (s x 2) retum l: return s x*fun(Sample(s x一 l): int main() int sum=0; for(int i=0; k6; 1+) sum+=fun(Sample(i); cout sum, return 0; 运行时输出的结果是 ( )。 ( A) 120 ( B) 16 ( C) 154 ( D) 34 25 有如下程序: #inc1ude iostream #inc1ude cmath using std: cout; class Point
21、public: friend double distance(const Point &p); p距原点的距离 Point(int xx=0, int yy=0): x(xx), y(yy) private: int x, y; ; double distance(const Point &p) return sqrt(p x*p x+p y*p, y); int main() Point pl(3, 4); cout distance(pl); return 0; 下列叙述中正确的是 ( )。 ( A)程序编译正确 ( B)程序编译时语句 出错 ( C)程序编译时语句 出错 ( D)程序编译
22、时语句 出错 26 有如下程序: #inc1ude iostream using namespace std; class Boat; class Car public: Car(int i): weight(i) friend int Total(const Car c, const Boat b); private: int weight; ; class Boat public: Boat(int i): weight(i) friend int Total(const Car &c, const Boat &b); private: int weight; ; int Total(co
23、nst Car c, const Boat &b) return c weight+b weight; int main() Car c(10), Boat b(8); cout “The total weight is “ Total(c, b) endl; return 0: 下列关于程序的描述中,正确的是 ( )。 ( A)程序编译正确 ( B)程序编译时语句 出错 ( C)程序编译时语句 出错 ( D)程序编译时语句 出错 27 已知类 Myclass声明如下: class Myclass int n; public: Myclass(int k): n(k) int getValue
24、()const return n; ; 在下列数组定义中正确的是 ( )。 ( A) Myclass xl2; ( B) Myclass x22=new Myclass(1), new Myclass(2) ; ( C) Myclass *x32; ( D) Myclass *x42= Myclass(1), Myclass(2) ; 28 己知类 Myclass的定义如下: class Myclass public: Myclass (int d)data=d; Myclass() private: int data; ; 下列对 Myclass类对象数组的定义和初始化语句中,正确的是 (
25、)。 ( A) Myclass arrays2; ( B) Myclass arrays2=Myclass(5) ; ( C) Myclass arrays2=Myclass(5), Myclass(6) ; ( D) Myclass* arrays=new Myclass2; 国家二级 C+机试(类和对象)模拟试卷 8答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 this指针是成员函数所属对象的指针,它指向类对象的地址。成员函数通过这个指针知道自己属于哪一个对象。 this指针是一个隐含的指针,它隐含于每个类的非静态成员函数 中,它明确的地表示出了成员函数当前操作的数据所属的对
26、象。 【知识模块】 类和对象 2 【正确答案】 D 【试题解析】 this是成员函数所属对象的指针,它指向类对象的地址。成员函数通过这个指针可以知道自己属于哪一个对象。它隐藏于每个类的非静态成员函数中。 【知识模块】 类和对象 3 【正确答案】 A 【试题解析】 此题考查的是静态数据成员和静态成员函数。静态数据成员是类中所有对象共享的成员,而不是某个对象的成员。题目中的静态数据成员 n的运算具有叠加性,执行 “n+=2”和 “n一 =3”后 n的值为 0。 【知识模块】 类和对象 4 【正确答案】 D 【试题解析】 此题考查的是静态成员。本题中, Obj类定义了一个静态数据成员i,并初始化为
27、0在主函数中,首先定义了 1个该类对象 obl,所以构造函数被调用 1次, i加 l;然后调用函数 f(),该函数中又定义了一个对象 ob2,此时 i再次加l变为 2,然后通过函数 getVal()输出 i的值 2。 f()函数结束, ob2变量被释放,故析构函数被调用了 1次, i变成 1;回到主函数中,又动态创建了 1个对象并让ob3指向它,此后 i变成 2并输出。最后释 放动态创建的对象 i变为 1,输出 1。故最终的输出结果是 221。 【知识模块】 类和对象 5 【正确答案】 A 【试题解析】 此题考查的是静态成员。静态成员的特性是不管这个类创建了多少对象,它的静态成员都只有一个拷贝
28、副本,这个副本被所有属于这个类的对象共享。题目中,首先定义了 obj对象,其构造函数使静态数据成员 count增 l,故输出 “1”;然后通过指针动态创建了 MyClass类的对象,构造函数被再次调用,count变为 2,输出 “2”;接着删除创建的 MyClass类的对象,调用析构函数,count减 1变为 1,输出 “1”。故最终输出结果是 121。 【知识模块】 类和对象 6 【正确答案】 C 【试题解析】 此题考查的是静态数据成员的初始化。静态数据成员应在类体外进行初始化,且初始化的一般格式为:数据类型类名:静态数据成员名 =初始值。 【知识模块】 类和对象 7 【正确答案】 D 【试
29、题解析】 此题考查的是静态成员函数的引用。 getPI()是类 Constants的静态成员函数。引用静态成员函数可以有两种形式:一是通过类名直接进行调用,例如类名:静态成员函数名;另一种是 用类的任何对象名进行调用其作用仅是通过对象名间接的指出类名,例如 cOnstants getPI()选项 D即是这种调用方式。 【知识模块】 类和对象 8 【正确答案】 A 【试题解析】 类 AA的成员函数直接引用类 AA的非静态数据成员。 【知识模块】 类和对象 9 【正确答案】 C 【试题解析】 静态整型数据不能定义为类的数据成员。 【知识模块】 类和对象 10 【正确答案】 D 【试题解析】 fun
30、cyion4()函数作为类的静态成员函数,不能直接访问类中说明的非静态成员,即 cout data在编译时会出错。 【知识模块】 类和对象 11 【正确答案】 C 【试题解析】 在类 XA的构造函数中,定义了用成员变量 a的值初始化变量 aa,同时静态成员变量 b值加 1。所以当在主 main函数中定义类 XA的对象 d1( 4)后,变量 b的等于 1,定义对象 d2( 5)后,变量 b的值等于 2,所以表达式dl getA()+d2, getA()+XA: b+d1 b等于 4+5+1+2+1=13 【知识模块】 类和对象 12 【正确答案】 A 【试题解析】 此题考 查的是常对象与常成员函
31、数的概念。使用 const关键字修饰的对象称为常对象,它不能被更新,所以常对象只能调用常成员函数而不能调用其它成员函数;使用 const关键字声明的成员函数是常成员函数,它也不能被更新,常成员函数只能调用常成员函数而不能调用其它函数。 【知识模块】 类和对象 13 【正确答案】 A 【试题解析】 此题考查的是常成员函数。 Const关键字可以用于参与重载函数的区分,此时常对象调用常成员函数,一般对象调用一般成员函数,当类中只有一个常成员函数时,一般对象也可以调用该常成员函数。 本题中,通过 funl调用value()函数时,是调用前一个,而通过 fun2调用 value()函数是调用后一个;另
32、外, value()函数中访问的 i是类中定义的数据成员 i,全局变量 i在类中被 “屏蔽 ”。 funl value0输出 1一 1=2一 1=1; fun2 value()调用后 个 value()函数输出 i+1=2+1=3; Fun: i是通过类名直接访问类的静态数据成员 i的值,即 2;所以正确的输出顺序是 A选项。 【知识模块】 类和对象 14 【正确答案】 A 【试题解析】 此题考查的是常成员函数 的应用。 VAC类中说明了两个函数,一个是常成员函数,个是普通函数;在主函数中说明了两个对象,通过普通对象vl调用的是普通函数,输出 5:通过常对象 V2调用的是常成员函数,输出 3。
33、 【知识模块】 类和对象 15 【正确答案】 C 【试题解析】 在创建类对象 objl( 10)时,前面有关键字 const,所以当语句 3调用 objl的成员函数试图修改其私有成员的数值的时候,会编译出错。 【知识模块】 类和对象 16 【正确答案】 B 【试题解析】 由题意可知 a为常对象,因为常对象不能被更 新,所以通过这个常对象只能调用它的常成员函数 GetData(),而不能调用其他成员函数 SetData( 10),因而选项 B为本题的正确答案。 【知识模块】 类和对象 17 【正确答案】 B 【试题解析】 类 A包括一个整型数据成员 r1,一个一般成员函数 print(),一个常
34、成员函数 print() const。在主函数中定义了对象 a1,并对 r1的值赋 2和常对象a2,并对 r1的值赋 4,在 C+中,常对象不能被更新,所以常对象只能调用类的常成员函数,而不能调用一般成员函数。而一般的对象,既可以调用一般 成员函数也可以调用常成员函数。所以在本题中,当执行 a1 print()时,输出为 E2一,执行 a2 print()时,输出为 C16一。 【知识模块】 类和对象 18 【正确答案】 D 【试题解析】 在主函数中创建 al对象时,调用类 A的默认构造函数,其数据成员 r1的值等于 0。当执行 a1 print( 2)语句时,调用带参数的 print成员函数
35、,所以输出结果为 p0一,对象 a2为常成员,所以其成员变量 rl的值等于 4,因为常对象只能调用常成员函数,所以当执行语句 a2 print()语句时,输出结果为C14一。 【知识模块】 类和对象 19 【正确答案】 C 【试题解析】 常成员函数的说明格式如下:返回类型成员函数名(参数表) const;,所以对于本题来说无参且无返回值的常成员函数 show,其正确的函数原型是选项 C)。 【知识模块】 类和对象 20 【正确答案】 D 【试题解析】 函数 listen()作为类 IMS的常成员函数,一般对象 objl和常对象obj2都可以调用它,而函数 speak()作为 IMS的一般成员函
36、数,则只有一般对象objl可以调用,而常对象 obj2调用会产生编译错误。 【知识模块】 类和对象 21 【正确答案】 A 【试题解析】 const成员函数表示该成员函数只 能读类数据成员,而不能修改类成员数据。定义 const成员函数时,把 const关键字放在函数的参数表和函数体之间。 【知识模块】 类和对象 22 【正确答案】 D 【试题解析】 类 Test中的常成员函数 h()返回数据成员 a的值。 【知识模块】 类和对象 23 【正确答案】 B 【试题解析】 此题考查了常成员函数和友元函数的概念。选项 A中, getRef()函数的返回值和函数函数类型不符,故错误; C选项中 set
37、()常成员函数改变了数据成员的值,这是不允许的; D选项中 show()函数被同时定义成友元函数和常成员函数是错误的。 【知识模块】 类和对象 24 【正确答案】 C 【试题解析】 此题考查的是友元函数和递归函数。因为 fun函数是 Sample类的友元函数,所以 fun函数可以直接访问 Sample类对象的私有成员 x。主函数调用fun函数,构造参数为 0 5。当 n小于 2时, fun函数返回 1,其余返回值为n*fun( n一 1)。 n取 05的值时 fun( n)依次为 1, l, 2, 6, 24, 120,累加结果为 154。 【知识模块】 类和对象 25 【正确答案】 A 【试
38、题解析】 这段程序是正确的,计算 p距离原点的距离。语句 是类 Point的构造函数,在构造函数中给变量 xx和 yy赋初值 0。语句 是计算点 p距原点的距离的函数 distance。语句 是计算点 pl距离原点的距离并输出。 【知识模块】 类和对象 26 【正确答案】 A 【试题解析】 程序中定义了类 Car和类 Boat,在两个类中分别定义他们的构造函数和友元函数 friend。程序在 VC6 0中编译通过。 【知识模块】 类和对象 27 【正确答案】 C 【试题解析】 考查的是对象数组。选项 A中在建立对象数组时也同样需要调用构造函数:选项 B和 D的类型不匹配, B中不能将指针传给非指针, D中是将非指针传给指针。 【知识模块】 类和对象 28 【正确答案】 C 【试题解析】 在选项 C)中定义了类 MyClass对象数组 arrays2,并用对象MyClass( 5)和 MyClass( 6)对这个数组中的两个元素赋初值。 【知识模块】 类和对象