1、国家二级 C+机试(类和对象)模拟试卷 20及答案解析(总分:54.00,做题时间:90 分钟)一、选择题(总题数:27,分数:54.00)1.下列关于 this指针的描述中,正确的是( )。(分数:2.00)A.类的成员函数都有 this指针B.类的友元函数都有 this指针C.任何与类相关的函数都有 this指针D.类的非静态成员函数都有 this指针2.有如下程序: #includeiostream using namespace std; class Test public: Test() n+=2; Test()n-=3; static int getNum0return n; pr
2、ivate: static int n; ; int Test:n=1; int main() Test*p=new“rest; delete p; toutn=Test:getNum()end1; return 0; 执行后的输出结果是( )。(分数:2.00)A.n=0B.n=1C.n=2D.n=33.有如下程序: #includeiostream using namespace std; class Obj static int i; public: Obj()i+; Obj()i-; static hat getVal()return i; ; int Obj:i=0; void f(
3、)Obj ob2;coutob2getVal(); int main() Obj ob1; f(); Obj*ob3=new Obj;coutob3-getVal q(); delete ob3;coutObj:getVal(); return 0; 程序的输出结果是( )。(分数:2.00)A.232B.231C.222D.2214.有如下程序: #includeiostream using namespace std; class MyClass public: MyClass()+count; MyClass()-count; static int getCount()return co
4、unt; private: static int count; ; int MyClass:count=0; int main() MyClass obj; coutobjgetCount();MyClass*ptr=new MyClass; coutMyClass:getCount(); delete ptr; coutMyClass:getCount(); return 0; 程序的输出结果是( )。(分数:2.00)A.121B.232C.221D.1225.有如下类定义: class Point private; static int how_many; ; _how_many=0;
5、要初始化Point类的静态成员 how_many,下划线处应填入的内容是( )。(分数:2.00)A.ingB.static intC.int Point:D.static int Point:6.有如下类和对象的定义: class Constants public; static double getPl()return 31416; ;Constants constants; 下列各组语句中,能输出 31416 的是( )。(分数:2.00)A.coutconstants-getPI();和 coutConstants:gerPI();B.coutconstantsgetPI();和 co
6、utConstantsgetPI();C.coutconstants-getaI();和 coutConstants-getPI();D.coutconstantsgetPI();和 coutConstants:getPI();7.若 AA为一个类,a 为该类的非静态数据成员,在该类的一个成员函数定义中访问 a时,其书写格式为( )。(分数:2.00)A.aB.AAaC.aD.AA:a8.有如下类定义: class Sample public; Sample(int x):ref(x) private:Sample():ref(0) static int val=5; const int re
7、f; ;上述程序段中,错误的语句是( )。(分数:2.00)A.B.C.D.9.已知类 Myclass的定义如下 class MyClass public: void function1(MyClass const Fun fun2; return 0; 若程序的输出结果是: 123 则程序中下划线处遗漏的语句是( )。(分数:2.00)A.coutfun1value()Fun:ifun2value();B.coutFun:ifun1value()fun2value();C.coutfun 1value()fun2value()Fun:i;D.coutfun2value()Fun:ifun1v
8、alue();13.有如下程序: #includeiostream using namespace std; class VAC public; int f() constreturn 3; int f() return 5; ; Int main() VAC v1; const VAC v2; coutv1f()v2f(); fetum 0; 运行时的输出结果是( )。(分数:2.00)A.53B.35C.55D.3314.有如下程序: #includeiostream using namespace std; class MyClass public: MyClass(int x):Val
9、(x) void Set(int x)val=x; void Print()constcoutval=valt; private: int val; ; int main() const MyClass obj 1(10); MyClass obj2(20); obj1Print(); 语句 1 obj2Print(); 语句 2 obj1Set(20);语句 3 obj2Set(30);语句 4 return 0; 其主函数中错误的语句是( )。(分数:2.00)A.语句 1B.语句 2C.语句 3D.语句 415.有如下类定义和变量定义: class A public: A()data=0
10、; A() int GetData() constreturn data; void SetData(int n) data=n; priyate: int data; ; const A a; A b; 下列函数调用中错误的是( )。(分数:2.00)A.aGetData();B.aSetData(10);C.bGetData();D.bSetData(10);16.有如下程序: #includeiostream Using namespace std; class A public: A(int i): r1(i) vgid print() coutEr1-; void print() c
11、onst coutCr1*r1-; private: int r1; ; int main() A a1(2); const Aa2(4); a1print(); a2print();return 0; 运行时的输出结果是( )。(分数:2.00)A.运行时出错B.E2-C16-C.C4-C16-D.E2-E4-17.有如下程序: #includeiostream using namespace std; class A public: A(int i=0):r1(i) void print()coutEr1-; void print()constcoutCr1*r1-; void print
12、(int x)coutpr1*r1*r1-; private: int r1; ; mt main() A a1; const A a2(4); a1print(2); a2print(); return 0; 运行时的输出结果是( )。(分数:2.00)A.P8-E4B.P8-C16-C.P0-E4-D.P0-C16-18.某类中有一个无参且无返回值的常成员函数 Show,则正确的 Show函数原型是( )。(分数:2.00)A.const void Show();B.void const Show();C.void Show()const;D.void Show(const);19.已知类
13、 IMS中两个成员函数的声明为“void listen()const;”与“void speak();”,另有两个对象的定义为“IMS obj1;”与“const IMS obj2;”,则下列语句中,产生编译错误的是( )。(分数:2.00)A.obj1listen();B.obj1speak();C.obj2listenO;D.obj2speak();20.已知函数 print()没有返回值,如果在类中将之声明为常成员函数,正确的是( )。(分数:2.00)A.voidprint()const;B.constvoidprint();C.void const print();D.void pr
14、int(const);21.有如下类定义: 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 h() constreturn a; 第 4行 ; 编译时没有错误的行是( )。(分数:2.00)A.第 1行B.第 2行C.第 3行D.第 4行22.有如下类定义: class AA int a; public; int getRef()constreturn const Fun fu
15、n2; return 0; 若程序的输出结果是: 123 则程序中下划线处遗漏的语句是( )。(分数:2.00)A.coutfun1value()Fun:ifun2value(); B.coutFun:ifun1value()fun2value();C.coutfun 1value()fun2value()Fun:i;D.coutfun2value()Fun:ifun1value();解析:解析:此题考查的是常成员函数。const 关键字可以用于参与重载函数的区分,此时常对象调用常成员函数,一般对象调用一般成员函数,当类中只有一个常成员函数时,一般对象也可以调用该常成员函数。本题中,通过 fu
16、n1调用 value()函数时,是调用前一个,而通过 fun2调用 value()函数是调用后一个;另外,value()函数中访问的 i是类中定义的数据成员 i,全局变量 i在类中被“屏蔽”。fun1value()输出 i-1=2-1=1;fun2value()调用后一个 value()函数输出 i+1=2+1=3;Fun:i 是通过类名直接访问类的静态数据成员 i的值,即 2;所以正确的输出顺序是 A选项。13.有如下程序: #includeiostream using namespace std; class VAC public; int f() constreturn 3; int f
17、() return 5; ; Int main() VAC v1; const VAC v2; coutv1f()v2f(); fetum 0; 运行时的输出结果是( )。(分数:2.00)A.53 B.35C.55D.33解析:解析:此题考查的是常成员函数的应用。VAC 类中说明了两个函数,一个是常成员函数,一个是普通函数;在主函数中说明了两个对象,通过普通对象 v1调用的是普通函数,输出 5:通过常对象 V2调用的是常成员函数,输出 3。14.有如下程序: #includeiostream using namespace std; class MyClass public: MyClass
18、(int x):Val(x) void Set(int x)val=x; void Print()constcoutval=valt; private: int val; ; int main() const MyClass obj 1(10); MyClass obj2(20); obj1Print(); 语句 1 obj2Print(); 语句 2 obj1Set(20);语句 3 obj2Set(30);语句 4 return 0; 其主函数中错误的语句是( )。(分数:2.00)A.语句 1B.语句 2C.语句 3 D.语句 4解析:解析:在创建类对象 obj1(10)时,前面有关键字
19、 const,所以当语句 3调用 obj1的成员函数试图修改其私有成员的数值的时候,会编译出错。15.有如下类定义和变量定义: class A public: A()data=0; A() int GetData() constreturn data; void SetData(int n) data=n; priyate: int data; ; const A a; A b; 下列函数调用中错误的是( )。(分数:2.00)A.aGetData();B.aSetData(10); C.bGetData();D.bSetData(10);解析:解析:由题意可知 a为常对象,因为常对象不能被更
20、新,所以通过这个常对象只能调用它的常成员函数 GetData(),而不能调用其他成员函数 SetData(10),因而选项 B为本题的正确答案。16.有如下程序: #includeiostream Using namespace std; class A public: A(int i): r1(i) vgid print() coutEr1-; void print() const coutCr1*r1-; private: int r1; ; int main() A a1(2); const Aa2(4); a1print(); a2print();return 0; 运行时的输出结果是
21、( )。(分数:2.00)A.运行时出错B.E2-C16- C.C4-C16-D.E2-E4-解析:解析:类 A包括一个整型数据成员 r1,一个一般成员函数 print(),一个常成员函数 print()const。在主函数中定义了对象 a1,并对 r1的值赋 2和常对象 a2,并对 r1的值赋 4,在 C+中,常对象不能被更新,所以常对象只能调用类的常成员函数,而不能调用一般成员函数。而一般的对象,既可以调用一般成员函数也可以调用常成员函数。所以在本题中,当执行 a1print()时,输出为 E2-,执行a2print()时,输出为 c16-。17.有如下程序: #includeiostre
22、am using namespace std; class A public: A(int i=0):r1(i) void print()coutEr1-; void print()constcoutCr1*r1-; void print(int x)coutpr1*r1*r1-; private: int r1; ; mt main() A a1; const A a2(4); a1print(2); a2print(); return 0; 运行时的输出结果是( )。(分数:2.00)A.P8-E4B.P8-C16-C.P0-E4-D.P0-C16- 解析:解析:在主函数中创建 a1对象时
23、,调用类 A的默认构造函数,其数据成员 r1的值等于 0。当执行a1print(2)语句时,调用带参数的 print成员函数,所以输出结果为 p0-对象 a2为常成员,所以其成员变量 r1的值等于 4,因为常对象只能调用常成员函数,所以当执行语句 a2print()语句时,输出结果为 C14。18.某类中有一个无参且无返回值的常成员函数 Show,则正确的 Show函数原型是( )。(分数:2.00)A.const void Show();B.void const Show();C.void Show()const; D.void Show(const);解析:解析:常成员函数的说明格式如下:
24、返回类型成员函数名(参数表)const;,所以对于本题来说无参且无返回值的常成员函数 show,其正确的函数原型是选项 C。19.已知类 IMS中两个成员函数的声明为“void listen()const;”与“void speak();”,另有两个对象的定义为“IMS obj1;”与“const IMS obj2;”,则下列语句中,产生编译错误的是( )。(分数:2.00)A.obj1listen();B.obj1speak();C.obj2listenO;D.obj2speak(); 解析:解析:函数 listen()作为类 IMS的常成员函数,一般对象 obj1和常对象 obj2都可以调
25、用它,而函数 speak()作为 IMS的一般成员函数,则只有一般对象 obj1可以调用,而常对象 obi2调用会产生编译错误。20.已知函数 print()没有返回值,如果在类中将之声明为常成员函数,正确的是( )。(分数:2.00)A.voidprint()const; B.constvoidprint();C.void const print();D.void print(const);解析:解析:const 成员函数表示该成员函数只能读类数据成员,而不能修改类成员数据。定义 const成员函数时,把 const关键字放在函数的参数表和函数体之间。21.有如下类定义: class Tes
26、t 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 h() constreturn a; 第 4行 ; 编译时没有错误的行是( )。(分数:2.00)A.第 1行B.第 2行C.第 3行D.第 4行 解析:解析:类 Test中的常成员函数 h()返回数据成员 a的值。22.有如下类定义: class AA int a; public; int getRef()constreturn&a; int g
27、etValue()constreturn a; void set(int n)consta=n; friend void show(AA aa)constcouta; ; 其中的四个函数定义中正确的是( )。(分数:2.00)A.B. C.D.解析:解析:此题考查了常成员函数和友元函数的概念。选项 A中,getRef()函数的返回值和函数函数类型不符,故错误;C 选项中 set()常成员函数改变了数据成员的值,这是不允许的:D 选项中 show()函数被同时定义成友元函数和常成员函数是错误的。23.有如下程序: #includeiostream using namespace std; cla
28、ss Sample friend long fun(Sample s); public: Sample(long a)x=a; private: long x; ; long fun(Sample s) if(sx2) return 1: return sx*fun(Sample(sx-1): int main() int sum=0; for(int i=0;i6;i+)sum+=fun(Sample(i); coutsum; return 0; 运行时输出的结果是( )。(分数:2.00)A.120B.16C.154 D.34解析:解析:此题考查的是友元函数和递归函数。因为 fun函数是
29、Sample类的友元函数,所以 fun函数可以直接访问 Sample类对象的私有成员 x。主函数调用 fun函数,构造参数为 05。当 n小于 2时,fun函数返回 1,其余返回值为 n*fun(n-1)。n 取 05 的值时 fun(n)依次为 1,1,2,6,24,120,累加结果为 154。24.有如下程序: #includeiostream #includecmath using std:cout; class Point public: Mend double distance(const Point&p); p 距原点的距离 Point(int xx=0,int yy=0):x(x
30、x),y(yy) private: int x,y; ; double distance(const Point&p) return sqrt(px*px+py*py); int main() Point p1(3,4); coutdistance(p1); return 0; 下列叙述中正确的是( )。(分数:2.00)A.程序编译正确 B.程序编译时语句出错C.程序编译时语句出错D.程序编译时语句出错解析:解析:这段程序是正确的,计算 p距离原点的距离。语句是类 Point的构造函数,在构造函数中给变量 xx和 yy赋初值 0。语句是计算点 p距原点的距离的函数 distance。语句是计
31、算点 p1距离原点的距离并输出。25.有如下程序: #includeiostream using namespace std; class Boat; class Car public: Car(int i):weight(i) Mend int Total(const Car&c,const Boat&b); private: int weight; ; class Boat public: Boat(int i):weight(i) Mend int Total(const Car&c,const Boat&b);private: int weight; ; int Total(const
32、 Car&c,const Boatb) return cweight+bweight; int main() Car c(10); Boat b(8); coutThe total weight isTotal(c,b)endl; return 0; 下列关于程序的描述中,正确的是( )。(分数:2.00)A.程序编译正确 B.程序编译时语句出错C.程序编译时语句出错D.程序编译时语句出错解析:解析:程序中定义了类 Car和类 Boat,在两个类中分别定义他们的构造函数和友元函数 friend。程序在 VC60 中编译通过。26.已知类 MyClass声明如下: class MyClass i
33、nt n; public: MyClass(int k):n(k) int getValueoconst return n; ; 在下列数组定义中正确的是( )。(分数:2.00)A.MyClass x12;B.MyClass x22=new MyClass(1),new MyClass(2);C.MyClass*x32; D.MyClass*x42=MyClass(1),MyClass(2);解析:解析:考查韵是对象数组。选项 A中在建立对象数组时也同样需要调用构造函数:选项 B和 D的类型不匹配,B 中不能将指针传给非指针,D 中是将非指针传给指针。27.已知类 Myclass的定义如下:
34、 class MyClass public: MyClass(int d)data=d; MyClass () private: int data; ; 下列对 Myclass类对象数组的定义和初始化语句中,正确的是( )。(分数:2.00)A.MyClass arrays2;B.MyClass arrays2=MyClass(5);C.MyClass arrays2=MyClass(5),MyClass(6); D.MyClass * arrays=new MyClass2;解析:解析:在选项 C中定义了类 MyClass对象数组 arrays2,并用对象 MyClass(5)和 MyClass(6)对这个数组中的两个元素赋初值。