国家二级C++机试(类和对象)模拟试卷2(共197题)_第1页
国家二级C++机试(类和对象)模拟试卷2(共197题)_第2页
国家二级C++机试(类和对象)模拟试卷2(共197题)_第3页
国家二级C++机试(类和对象)模拟试卷2(共197题)_第4页
国家二级C++机试(类和对象)模拟试卷2(共197题)_第5页
已阅读5页,还剩56页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

国家二级C++机试(类和对象)模拟试卷2(共9套)(共197题)国家二级C++机试(类和对象)模拟试卷第1套一、选择题(本题共25题,每题1.0分,共25分。)1、下列程序段中包含4个函数。其中具有隐含this指针的是()。intfunl();classTest{public:intfun2();friendintfun3();staticintfun4();}A、funlB、fun2C、fun3D、fun4标准答案:B知识点解析:this指针是成员函数所属对象的指针,它指向类对象的地址。成员函数通过这个指针知道自己属于哪一个对象。this指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确的地表示出了成员函数当前操作的数据所属的对象。2、下列关于this指针的描述中,正确的是()。A、类的成员函数都有this指针B、类的友元函数都有this指针C、任何与类相关的函数都有this指针D、类的非静态成员函数都有this指针标准答案:D知识点解析:this是成员函数所属对象的指针,它指向类对象的地址。成员函数通过这个指针可以知道自己属于哪一个对象。它隐藏于每个类的非静态成员函数中。3、有如下程序:#inc1ude<iostream>usingnamespacestd;classTest{public:Test(){n+=2;}~Test(){n.=3;}staticintgetNum(){returnn;}private:staticintn;};intTest::n=1;intmain(){Test*p=newTest;deletep;cout<<"n="<<Test::getNum()<<endl;return0;}执行后的输出结果是()。A、n=0B、n=1C、n=2D、n=3标准答案:A知识点解析:此题考查的是静态数据成员和静态成员函数。静态数据成员是类中所有对象共享的成员,而不是某个对象的成员。题目中的静态数据成员n的运算具有叠加性,执行“n+=2”和“n一=3”后n的值为0。4、有如下程序:#inc1ude<iostream>usingnamespacestd;classObj{staticinti;public:Obj(){i++;)一Obj(){i一一;)staticintgetVal(){returni;)};intObj::i=0;voidf(){Objob2;cout<<ob2.getVal();}intmain(){Objobl;f();Obj*ob3=newObj;cout<<ob3一>getVal();deleteob3;cout<<Obj::getVal();return0;}程序的输出结果是()。A、232B、231C、222D、221标准答案:D知识点解析:此题考查的是静态成员。本题中,Obj类定义了一个静态数据成员i,并初始化为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、有如下程序:#inc1ude<iostream>usingnamespacestd;classMyclass{public:Myclass(){++count;}~Myclass(){一一count;}staticintgetCount(){returncount,}private:staticintcount,};intMyclass::count=0;intmain(){.Myclassobj;cout<<obj.getCount();Myclass*ptr=newMyclass;cout<<Myclass::getCount();deleteptr;cout<<Myclass::getCount();return0;}程序的输出结果是()。A、121B、232C、221D、122标准答案:A知识点解析:此题考查的是静态成员。静态成员的特性是不管这个类创建了多少对象,它的静态成员都只有一个拷贝副本,这个副本被所有属于这个类的对象共享。题目中,首先定义了obj对象,其构造函数使静态数据成员count增l,故输出“1”;然后通过指针动态创建了MyClass类的对象,构造函数被再次调用,count变为2,输出“2”;接着删除创建的MyClass类的对象,调用析构函数,count减1变为1,输出“1”。故最终输出结果是121。6、有如下类定义:classPoint{private;staticinthow_many;};_______how_many=0;要初始化Point类的静态成员how_many,下划线处应填入的内容是()。A、ingB、staticintC、intPoint::D、staticintPoint::标准答案:C知识点解析:此题考查的是静态数据成员的初始化。静态数据成员应在类体外进行初始化,且初始化的一般格式为:数据类型类名::静态数据成员名=初始值。7、若AA为一个类,a为该类的非静态数据成员,在该类的一个成员函数定义中访问a时,其书写格式为()。A、aB、AA,aC、a{}D、AA::a{}标准答案:A知识点解析:类AA的成员函数直接引用类AA的非静态数据成员。8、有如下类定义:classSample{public;Sample(intx):ref(x){}//①private:Sample():ref(0){}//②staticintval=5;//③constintref;//④};上述程序段中,错误的语句是()。A、①B、②C、③D、④标准答案:C知识点解析:静态整型数据不能定义为类的数据成员。9、己知类Myclass的定义如下classMyclass{public:voidfunctionl(Myclass&c){cout<<c.data;)staticvoidfunction2(Myclass&c){cout<<c.data;}voidfunction3(){cout<<data;}staricvoidfunction4(){cout<<data;}private:intdata;};其中有编译错误的函数是()。A、functionlB、function2C、function3D、function4标准答案:D知识点解析:funcyion4()函数作为类的静态成员函数,不能直接访问类中说明的非静态成员,即cout<<data在编译时会出错。10、有如下程序:#inc1ude<iostream>usingnamespacestd;classXA{inta:public:staticintb:XA(intaa):a(aa){b++;).intgetA(){returna,)};intXA::b=0;intmain(){XAd1(4),d2(5);cout<<dl.getA()+d2.getA()+XA::b+d1.b<<endl;return0;}运行这个程序的输出结果是()。A、9B、11C、13D、15标准答案: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.11、由于常对象不能被更新,因此()。A、通过常对象只能调用它的常成员函数B、通过常对象只能调用静态成员函数C、常对象的成员都是常成员D、通过常对象可以调用任何不改变对象值的成员函数标准答案:A知识点解析:此题考查的是常对象与常成员函数的概念。使用const关键字修饰的对象称为常对象,它不能被更新,所以常对象只能调用常成员函数而不能调用其它成员函数;使用const关键字声明的成员函数是常成员函数,它也不能被更新,常成员函数只能调用常成员函数而不能调用其它函数。12、有如下程序#inc1ude<iostream>usingnamespacestd;inti=1;classFun{public:staticinti:intvalue(){returni一1;}intvalue()const{returni+1;}};intFun::i=2;intmain(){inti=3;Funfunl;constFunfun2;return0;}若程序的输出结果是:123则程序中下划线处遗漏的语句是()。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();标准答案:A知识点解析:此题考查的是常成员函数。Const关键字可以用于参与重载函数的区分,此时常对象调用常成员函数,一般对象调用一般成员函数,当类中只有一个常成员函数时,一般对象也可以调用该常成员函数。本题中,通过funl调用value()函数时,是调用前一个,而通过fun2调用value()函数是调用后一个;另外,value()函数中访问的i是类中定义的数据成员i,全局变量i在类中被“屏蔽”。funl.value0输出1一1=2一1=1;fun2.value()调用后…个value()函数输出i+1=2+1=3;Fun::i是通过类名直接访问类的静态数据成员i的值,即2;所以正确的输出顺序是A选项。13、有如下程序:#inc1ude<iostream>usingnamespacestd;classVAC{public;intf()const{return3;}intf(){return5;});Intmain(){VACvl;constVACv2;cout<<V1.f()<<V2.fi();feturn0;)运行时的输出结果是()。A、53B、35C、55D、33标准答案:A知识点解析:此题考查的是常成员函数的应用。VAC类中说明了两个函数,一个是常成员函数,~个是普通函数;在主函数中说明了两个对象,通过普通对象vl调用的是普通函数,输出5:通过常对象V2调用的是常成员函数,输出3。14、有如下程序:#inc1ude<iostream>usingnamespacestd;classMyclass{public:Myclass(intx):val(x){}voidSet(intx){val=x;}voidPrint()const{cont<<"Val="<<Val<<’\t’;)private:intval,};intmain(){constMyclassobj1(10);Myclassobj2(20);obj1.Print();//语句1obj2.Print();//语句2obj1.Set(20);//语句3obj2.Set(30);//语句4return0;}其主函数中错误的语句是()。A、语句1B、语句2C、语句3D、语句4标准答案:C知识点解析:在创建类对象objl(10)时,前面有关键字const,所以当语句3调用objl的成员函数试图修改其私有成员的数值的时候,会编译出错。15、有如下类定义和变量定义:classA{public:A(){data=0;}~A(){}intGetData()const{retumdata;}voidSetData(intn){data=n;}private:intdata;};constAa;Ab;下列函数调用中错误的是()。A、a.GetData();B、a.SetData(10);C、b.GetData();D、b.SetData(10);标准答案:B知识点解析:由题意可知a为常对象,因为常对象不能被更新,所以通过这个常对象只能调用它的常成员函数GetData(),而不能调用其他成员函数SetData(10),因而选项B为本题的正确答案。16、有如下程序:#inc1ude<iostream>usingnamespacestd;classA{public:A(inti):rl(i){}yoidprint(){cout<<’E’<<r1<<’_’;}voidprint()const{cout<<’C’<<r1*rl<<’一’;}private:intr1,};intmain(){Aa1(2);constAa2(4);a1.print();a2.print();return0;}运行时的输出结果是()。A、运行时出错B、E2一C16一C、C4一C16一D、E2一E4一标准答案:B知识点解析:类A包括一个整型数据成员r1,一个一般成员函数print(),一个常成员函数print()const。在主函数中定义了对象a1,并对r1的值赋2和常对象a2,并对r1的值赋4,在C++中,常对象不能被更新,所以常对象只能调用类的常成员函数,而不能调用一般成员函数。而一般的对象,既可以调用一般成员函数也可以调用常成员函数。所以在本题中,当执行a1.print()时,输出为E2一,执行a2.print()时,输出为C16一。17、有如下程序:#inc1ude<iostream>usingnamespacestd;classA{public:A(inti=0):rl(i){}voidprint(){cout<<’E’<<rl<<’一’;}voidprint()const{cout<<’C’<r1*rl<<’一’;}voidprint(intx){cout<<’p’<<r1*r1*r1<<’一’;}private:intr1,};intmain(){Aa1;constAa2(4);al.print(2);a2.print();rcturn0;}运行时的输出结果是()。A、P8一E4B、P8一C16一C、P0一E4一D、P0一C16一标准答案:D知识点解析:在主函数中创建al对象时,调用类A的默认构造函数,其数据成员r1的值等于0。当执行a1.print(2)语句时,调用带参数的print成员函数,所以输出结果为p0一,对象a2为常成员,所以其成员变量rl的值等于4,因为常对象只能调用常成员函数,所以当执行语句a2.print()语句时,输出结果为C14一。18、某类中有一个无参且无返回值的常成员函数Show,则正确的Show函数原型是()。A、constvoidShow();B、voidconstShow();C、voidShow()const;D、voidShow(const);标准答案:C知识点解析:常成员函数的说明格式如下:<返回类型><成员函数名>(<参数表>)const;,所以对于本题来说无参且无返回值的常成员函数show,其正确的函数原型是选项C)。19、已知类IMS中两个成员函数的声明为“voidlisten()const;”与“voidspeak();”,另有两个对象的定义为“IMSobjl;”与“constIMSobj2;:”,则下列语句中,产生编译错误的是()。A、objl.listen();B、objl.speak();C、,obj2.listen();D、obj2.speak();标准答案:D知识点解析:函数listen()作为类IMS的常成员函数,一般对象objl和常对象obj2都可以调用它,而函数speak()作为IMS的一般成员函数,则只有一般对象objl可以调用,而常对象obj2调用会产生编译错误。20、已知函数print()没有返回值,如果在类中将之声明为常成员函数,正确的是()。A、voidprint()const;B、constvoidprint();C、voidconstprint();D、voidprint(const);标准答案:A知识点解析:const成员函数表示该成员函数只‘能读类数据成员,而不能修改类成员数据。定义const成员函数时,把const关键字放在函数的参数表和函数体之间。21、有如下类定义:classTest{chara;constcharb;public:Test(charc){a=c;b=c;)//第1行voidf(chara)const{this一>a=a;)//第2行voidg(charb){this一>b=b;)//第3行charhoconst{returna;//第4行};编译时没有错误的行是()。A、第3行B、第4行C、第1行D、第2行标准答案:D知识点解析:类Test中的常成员函数h()返回数据成员a的值。22、有如下类定义:classAA{inta;public:intgetRef()const{return.&a,)//①intgetValue()const{returna;)//②voidset(intn)const{a=n;)//③friend一voidshow(AAaa)const{cout<<a,}//④};其中的四个函数定义中正确的是()。A、①B、②C、③D、④标准答案:B知识点解析:此题考查了常成员函数和友元函数的概念。选项A中,getRef()函数的返回值和函数函数类型不符,故错误;C选项中set()常成员函数改变了数据成员的值,这是不允许的;D选项中show()函数被同时定义成友元函数和常成员函数是错误的。23、有如下程序:#inc1ude<iostream>#inc1ude<cmath>usingstd::cout;classPoint{public:frienddoubledistance(constPoint&p);//p距原点的距离Point(intxx=0,intyy=0):x(xx),y(yy){}//①private:intx,y;};doubledistance(constPoint&p){//②returnsqrt(p.x*p.x+p.y*p,y);}intmain(){Pointpl(3,4);cout<<distance(pl);//③return0;}下列叙述中正确的是()。A、程序编译正确B、程序编译时语句①出错C、程序编译时语句②出错D、程序编译时语句③出错标准答案:A知识点解析:这段程序是正确的,计算p距离原点的距离。语句①是类Point的构造函数,在构造函数中给变量xx和yy赋初值0。语句②是计算点p距原点的距离的函数distance。语句③是计算点pl距离原点的距离并输出。24、已知类Myclass声明如下:classMyclass{intn;public:Myclass(intk):n(k){}intgetValue()const{returnn;}};在下列数组定义中正确的是()。A、Myclassxl[2];B、Myclassx2[2]={newMyclass(1),newMyclass(2)};C、Myclass*x3[2];D、Myclass*x4[2]={Myclass(1),Myclass(2)};标准答案:C知识点解析:考查的是对象数组。选项A中在建立对象数组时也同样需要调用构造函数:选项B和D的类型不匹配,B中不能将指针传给非指针,D中是将非指针传给指针。25、己知类Myclass的定义如下:classMyclass{public:Myclass(intd){data=d;}~Myclass(){}private:intdata;};下列对Myclass类对象数组的定义和初始化语句中,正确的是()。A、Myclassarrays[2];B、Myclassarrays[2]={Myclass(5)};C、Myclassarrays[2]={Myclass(5),Myclass(6)};D、Myclass*arrays=newMyclass[2];标准答案:C知识点解析:在选项C)中定义了类MyClass对象数组arrays[2],并用对象MyClass(5)和MyClass(6)对这个数组中的两个元素赋初值。国家二级C++机试(类和对象)模拟试卷第2套一、选择题(本题共22题,每题1.0分,共22分。)1、有如下程序:#include<iostream>usingnarnespacestd;classtest{private:inta;public:test0{cout+’’constructor’’+endl;}test(inta){cout+a+endl;}test(consttest&test){a=test.a;cout+’’copyconstructor’’+en.d1;}test(){cout+’’destructor"+endl;}};intmain(){testA(3);return0;}运行时输出的结果是()。A、3B、constructordestructorC、copyconstructordestructorD、3destructor标准答案:D知识点解析:此题考查的是构造函数和析构函数。一个类可以有多个构造函数,但只能有一个析构函数。每一个对象在被创建时,都会隐含调用众多构造函数中的一个,而在销毁时又会隐含调用唯一的析构函数。此题中,主函数创建对象A是会隐含调用。test(inta)这个构造函数,输出3;接着主函数结束,对象A销毁又隐含调用~test()析构函数输出destructor。2、对于一个类定义,下列叙述中错误的是()。A、如果没有定义拷贝构造函数,编译器将生成一个拷贝构造函数B、如果没有定义缺省的构造函数,编译器将一定生成一个缺省的构造函数C、如果没有定义构造函数,编译器将生成一个缺省的构造函数和一个拷贝构造函数D、如果已经定义了构造函数和拷贝构造函数,编译器不会生成任何构造函数标准答案:B知识点解析:此题考查的是构造函数。如果一个类中没有定义任何构造函数,编译器将生成一个不带参数的公有缺省构造函数。但只要定义了一个任意的构造函数,就不会生成缺省构造函数了。3、有如下程序:#include<iostream>usingnamespacestd;classPart{public:Part(intx=0):val(x){cout<<val;}~Part(){cout<<val;}private:intval;};classWhole{public:Whole(intx,inty,intz=0):p2(x),p1(y),val(z){cout<<val;}~Whole(){cout<<val;}private:Partp1,p2;intval;};intmain(){Wholeobj(1,2,3);return0;}程序的输出结果是()。A、123321B、213312C、213D、123123标准答案:B知识点解析:此题考查的是类的构造与析构。建立类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序(自左向右)接着执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序,最后执行自身的构造函数。析构顺序与之相反。本题中,Whole类中有两个Part类的成员p1和p2,根据它们定义的顺序,先构造p1再构造p2。所以,首先被构造的是p1(y),输出2;第二个被构造的是p2(x),输出1;最后调用析构函数,输出val的值3;析构函数调用顺序与构造函数相反。故最后输出213312。4、有如下程序:#include<iostream>usingnamespacestd;classBase{public:Base(intx=0){cout<<x;}};classDerived:publicBase{public:Derived(intx=0){cout<<x;}private:Baseval;};intmain(){Derivedd(1);return0;}程序的输出结果是()。A、0B、1C、01D、001标准答案:D知识点解析:此题考查的是类的构造。建立类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序(自左向右)->执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序->执行自身的构造函数。本题中,首先会构造基类Base,调用Base类的构造函数,输出0:然后还定义了一个Base类的对象,再次调用Base类的默认构造函数输出0;最后构造自身,因主函数中传入了构造参数1,所以输出1。故最后输出结果是:001。5、有如下类定义:classMyClass{Intvalue;public;MyClass(intn):value(n){}intgerValueoconst{returnvalue;}};则类MyClass的构造函数的个数是()。A、1个B、2个C、3个D、4个标准答案:A知识点解析:此题考查的是构造函数的概念。构造函数的名字必须与类名相同;构造函数不指定返回值类型;构造函数可以重载;在创建对象时,系统会自动调用构造函数。6、在C++中,编译系统自动为一个类生成缺省构造函数的条件是()。A、该类没有定义任何有参构造函数B、该类没有定义任何无参构造函数C、该类没有定义任何构造函数D、该类没有定义任何成员函数标准答案:C知识点解析:如果一个类中定义了一个缺省的构造函数,则使用该函数。如果一个类中没有定义任何构造函数,编译器将生成一个不带参数的共有缺省构造函数。7、有如下程序:#include<iostream>usingnamespacestd;classMyClass{public:MyClass(inti=0){cout<<1;}MyClass(constMyClass&x){cout<<2;}MyClass&operator=(constMyClass&x){cout<<3;return*this;}~MyClass0{cout<<4;}};intmain(){MyClassobj1(1),obj2(2),obj3(obj1);return0:}运行时的输出结果是()。A、112444B、11114444C、121444D、11314444标准答案:A知识点解析:当创建MyClass类对象obj1(1)和obj2(2)时候,调用类构造函数会输出两个1,然后创建类对象obj3(obj(1))时,会调用拷贝类构造函数,输出一个2,然后当main函数结束时候,调用三个对象的析构函数会输出三个4。8、有如下程序:#include<iostream>#include<cstfing>usingoamespacestd;classXCF{inta;public:XCF(intaa=0):a(aa){cout<<’’1’’;}XCF(XCF&x){a=x.a;cout<<’’2’’;}-XCF(){cout<<a;}intGeta(){return,a;}};intmain(){XCFd1(5),d2(d1);XCF*pd=newXCF(8);cout<<pd->Geta0;deletepd;return0;}运行时的输出结果是()。A、1215588B、1218855C、12185D、128512标准答案:B知识点解析:在这个程序中在建立对象dl(5)时,调用构造函数XCF(intaa=0):a(aa){tout<<"1’’;),输出1;在建立d2(d1)时,调用拷贝构造函数XCF(XCF&x){a=x.a;cout<<’’2’’;},输出2;在建立newXCF(8)对象时,调用构造函数XCF(intaa=0):a(aa){cout<<"1’’;},输出1;语句cout<<pd->Geta()的功能是输出8;语句deletepd;调用析构函数~XCF(),输出8;当退出程序时,分别释放对象d2、d1,输出55。9、有如下程序:#include<iostream>usingnamespacestd;classONE{intc;public:0NE():c(0){cout<<1;}ONE(intn):c(n){cout<<2;}};classTWO{ONEone1;ONEone2;public:TWO(intm):one2(m){cout<<3;}};intmain(){TWOt(4);return0;}运行时的输出结果是()。A、3B、23C、123D、213标准答案:C知识点解析:由类TWO的定义可知,其成员为类ONE的两个对象one1和one2。所以在主函数中构建类TWO的对象t(4)时,先后调用类ONE的构造函数ONE():c(0){cout<<1;}和ONE(intn):c(n){cout<<2;}输出12,然后再调用类TWO的构造函数TWO(intm):one2(m){cout<<3;},输出3。10、Sample是一个类,执行下面语句后,调用Sample类的构造函数的次数是,()。Samplea[2],*P=newSample;A、0B、1C、2D、3标准答案:D知识点解析:在C++中,声明一个类对象时,编译程序需要调用类的构造函数为对象分配存储空间,进行必须的初始化。在本题的这条语句中,声明了一个Sample类型的包含2个数组元素的数组a[2],一个指向类Sample对象的指针P,所以Sample类的构造函数共调用了3次。11、有如下程序:#include<iostream>usingnamespacestd;classToy{public:Toy(char*_n){strcpy(name,_n);count++;}~TOYO{count--;}char*GetName(){retBtnname;}staticintgetCount(){returncount;}private;charname[10];staticintcount;};intToy::count=0;intmain(){Toyt1(’’Snoopy’’),t2(’’Mickey’’),t3(’’Barbie’’);cout<<t1.getCount()<<end1;return0;}运行时的输出结果是()。A、1B、2C、3D、运行时出错标准答案:C知识点解析:类Toy中包含一个字符数组name和一个静态整型变量count。在程序中首先给类Toy的成员count的赋初始值0,然后在主函数中,定义了三个Toy对象t1、t2、t3,并分别对它们的name字段赋值,在赋值的同时变量count的值加l,所以最后变量count的值等于3。12、有如下程序#include<iostream>iasingnamespacestd;classTest{public:Test(){}Test(constTest&t){cout<<1;}};Testfun(Test&u){Testt=u;returnt;}intmain(){Testx,y;x=fun(y);return0;}运行这个程序的输出结果是()。A、无输出B、1C、11D、111标准答案:C知识点解析:在类Test中定义拷贝构造函数Test(constTest&t),其函数体为输出1,在主函数main中,当执行语句x=fun(y),调用拷贝函数用对象y的值构造对象u,输出1,在执行函数fun()的return语句时,调用拷贝函数构造匿名对象,输出1。13、若MyClass为一个类,执行“MyClassa[4],*p[5];”语句时会自动调用该类构造函数的次数是()。A、2B、5C、4D、9标准答案:C知识点解析:语句MyClassa[4],*p[5]不仅定义了4个MyClass对象,分别为a[0],a[1],a[2],a[3],而且定义了5个指向MyClass对象的指针变量,分别为*p[0],*p[1],*p[2],*p[3],*p[4],所以共调用MyClass的构造函数4次。14、有如下程序:#include<iostream>usingnamespacestd;classCD{public:~CDO{cout<<’C’;}private:charname[80];};hatmain(){CDa,*b,d[2];return0;}运行时的输出结果是()。A、CCCCB、CCCC、CCD、C标准答案:B知识点解析:在这个程序的主函数中定义了3个CD类的实例对象a,d[0],d[1]和一个指向CD类对象的指针变量b,所以当程序结束时,执行CD的析构函数输出字符C三次。15、有如下程序:#include<iostream>usingnamespacestd;classXA{inta;public:staticintb:XA(intaa):a(aa){b++;}~XA(){}intget(){returna;}};intXA::b=0;intmain(){XAdl(2),d2(3);cout<<d1.get()+d2.get()+XA::b<<end1;return0;}运行时的输出结果是()。A、5B、6C、7D、8标准答案:C知识点解析:执行XA类的实例变量d1(2)时,成员函数d1.get()的返回值等于2,XA.b的值等于1,执行XA类的实例变量d2(3)时,成员函数d1.get()的返回值等于3,XA.b的值等于2,所以输出结果为2+3+2=7。16、下列关于析构函数的描述中,错误的是()。A、析构函数可以重载B、析构函数由系统自动调用C、每个对象的析构函数只被调用一次D、每个类都有析构函数标准答案:A知识点解析:一般情况下,析构函数在对象的生存周期即将结束的时候由系统自动调用。在调用完成之后,对象也就消失了,相应的内存空间也被释放。析构函数没有参数,因此析构函数不能重载,一个类中只能定义一个析构函数。17、下列关于构造函数的描述中,错误的是()。A、构造函数名与类名相同B、构造函数可以有返回值C、构造函数可以重载D、每个类都有构造函数标准答案:B知识点解析:构造函数具有下面4个特殊的性质:构造函数的名字必须与类名相同;构造函数不指定返回类型,它隐含有返回值,由系统内部使用;构造函数可以有一个或多个参数。因此构造函数可以重载;在创建对象时,系统会自动调用构造函数。18、有如下程序:#include<iostream>usingnamespacestd;classMyClass{public:MyClass(){cout<<’*’;}MyClass(MyClass&a){cout<<’#’;}…MyClass(){cout<<’@’;}};intmain();MyClassa;Myclassb(a);return0;}运行时的输出结果是()。A、*@#@B、#@*@C、*#@@D、#*@@标准答案:C知识点解析:程序在执行时,先创建类对象a,输出*,再创建类对象b,输出#,然后再依次调用类对象b和a的析构函数,输出两个。19、下列关于类成员对象构造函数调用顺序的叙述中,正确的是()。A、与它们在初始化列表中的顺序相同B、与它们在类中声明的顺序相同C、与析构函数的调用顺序相同D、顺序不确定标准答案:B知识点解析:类成员对象构造函数的调用是按照在类中定义的顺序进行的,而不是按照构造函数说明后的冒号顺序进行构造的。20、有如下程序:#include<iostream>#include<cstring>usingnamespacestd;classMyString{public:charstr[80];MyString(constchar*s){strcpy(str,s);}MyString&operator+=(MySringa){strcat(str,a.str);return*this;}};ostream&operator<<(ostream&s,constMyString&z){returns<<z.str;}intmain(){MyStringx(’’abe’’),y(’’ede’’);eout<<(x+=y)<<end1;return0;}运行这个程序的输出结果是()。A、ahcB、CdeC、abCdeD、ahccde标准答案:D知识点解析:在类MyString中,定义了带参数的构造函数MyString(constchar*s),其作用是把s指向的字符串拷贝到字符组str中。在类中还对运算+=进行重载定义,其作用是把字符串s仃和a相连接并赋给str,所以在主函数中执行x+=y时,结果为abccde。21、下列关于this指针的叙述中,正确的是()。A、任何与类相关的函数都有this指针B、类的成员函数都有this指针C、类的友元函数都有this指针D、类的非静态成员函数才有this指针标准答案:D知识点解析:此题考查的是this指针的使用。类的每一个成员函数都有一个隐含的常量指针,即this指针。类的静态成员函数不能含有this指针,因为this指针是一个指向本对象的指针。22、有如下头文件:intf1();staticintf2();classMA{public:intf3();staticintf4();};在所描述的函数中,具有隐含的this指针的是()。A、flB、f2C、f3D、f4标准答案:C知识点解析:此题考查的是。this指针。this指针是一个隐含的指针,它隐含于每个类的非静态成员函数中,它明确地表示出了成员函数当前操作的数据所属的对象。题目中,只有f3()满足“类的非静态成员函数”的要求,故应选C选项。国家二级C++机试(类和对象)模拟试卷第3套一、选择题(本题共22题,每题1.0分,共22分。)1、有如下类声明:classSAMPLE{intn;public:SAMPLE(inti=0):n(i){}voidsetValue(intn0;};下列关于getValue成员函数的实现中,正确的是()。A、①B、②C、③D、④标准答案:D知识点解析:此题考查的是类的定义。一个类的长数据成员的初始化只能在成员初始化列表中进行,故选项A错误;常成员函数不能更新对象的数据成员,故选项B错误;静态成员函数可以直接访问类中说明的静态成员,但不能直接访问类中说明的非静态成员,故选项C错误。2、下列关于类定义的说法中,正确的是()。A、类定义中包括数据成员和函数成员的声明B、类成员的缺省访问权限是保护的C、数据成员必须被声明为私有的D、成员函数只能在类体外进行定义标准答案:A知识点解析:此题考查的是类的定义。类中缺省的访问权限是私有的,所以选项B错误;类的数据成员和成员函数的访问控制权限均可被声明为公有、私有和保护中的一种,所以选项C错误;成员函数的实现可以住类体内定义,也可以在类体外定义,所以选项D错误。3、下列运算符函数中,肯定不属于类Value的成员函数的是()。A、Valueoperator+(Value);B、Valueoperator-(Value,Value);C、Valueoperator*(int);D、Valueoperator/(Value);标准答案:B知识点解析:运算符作为非成员函数时,由于没有隐含this指针,因此所有的操作数必须出现在参数表中。对于第二个选项,出现了两个操作数,必然是非成员函数,但是对于其他三个选项,有可能都是要求两个操作数的成员函数。4、有如下程序:#includeusingnamespacestd;classPoint{intx,y;public:Point(intx1=0,inty1=0):x(x1),y(y1){}intget(){returnx+y;}};classCircle{Pointcenter;intradius;public:Circle(intcx,intcy,intr):center(cx,cy),radius(r){}intget(){returncenter.get()+radius;}};intmain(){Circlec(3,4,5);cout<A、5B、7C、9D、12标准答案:D知识点解析:根据类Point和类Circle的定义可知,类Circle的实例c(3,4,5)的成员函数c.get()返回值为3+4+5=12。5、下列关于类和对象的叙述中,错误的是()。A、一个类只能有一个对象B、对象是类的具体实例C、类是对某一类对象的抽象D、类和对象的关系是一种数据类型与变量的关系标准答案:A知识点解析:此题考查的是类和对象的概念。类是用户定义的一种数据类型,可以使用这个类型来说明一个或多个变量,即对象。6、若MyClass是一个类名,且有如下语句序列MyClassc1,*c2;MyClass*c3=newMyClass;MyClass&c4=c1;上面的语句序列所定义的类对象的个数是()。A、1B、2C、3D、4标准答案:C知识点解析:C1、*C2、C3是3个MyClass对象,C4是Mvclass对象的引用,它是对象C1的别名。7、有如下程序:#includeusingnamespacestd;classPair{intm,n;public:Pair(intj,intk):m(j),n(k){}intget(){returnm;)intget()const{returnm+n;}};intmain(){Paira(3,5);constPairb(3,5);cout<A、33B、38C、83D、88标准答案:B知识点解析:在主函数中定义了类Pair的一个实例变量a,并分别对实例变量a的数据成员m,n赋初值3,5。所以调用a.get()成员函数时,输出3。又定义类Pair的一个常实例变量b,并分别对实例变量b的数据成员m,n赋初值3,5。所以调用成员函数b.get()时,输出8。8、在下列函数原型中,可以作为类AA构造函数的是()。A、voidAA(int);B、intAA();C、AA(int)const;D、AA(int);标准答案:D知识点解析:此题考查的是构造函数的概念。构造函数是类的一个特殊成员函数,它与类同名,并且没有返回值。选项A、B不符合要求。选项C中函数AA,会更新对象的数据成员。9、有如下程序:#includeusingnamespacestd;classPart{public:Part(intx=0):val(x){cout<A、123321B、213312C、213D、123123标准答案:B知识点解析:此题考查的是类的构造与析构。建立类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序(自左向右)接着执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序,最后执行自身的构造函数。析构顺序与之相反。本题中,Whole类中有两个Part类的成员p1和p2,根据它们定义的顺序,先构造p1再构造p2。所以,首先被构造的是p1(y),输出2;第二个被构造的是p2(x),输出1;最后调用析构函数,输出val的值3;析构函数调用顺序与构造函数相反。故最后输出213312。10、在C++中,编译系统自动为一个类生成缺省构造函数的条件是()。A、该类没有定义任何有参构造函数B、该类没有定义任何无参构造函数C、该类没有定义任何构造函数D、该类没有定义任何成员函数标准答案:C知识点解析:如果一个类中定义了一个缺省的构造函数,则使用该函数。如果一个类中没有定义任何构造函数,编译器将生成一个不带参数的共有缺省构造函数。11、有如下程序:#include#includeusingnamespacestd;classXCF{inta;public:XCF(intaa=0):a(aa){cout<<”1”;)XCF(XCF&x){a=x.a;cout<<”2”;)~XCF(){cout<Geta();deletepd;return0:)运行时的输出结果是()。A、1215588B、1218855C、12185D、128512标准答案:B知识点解析:在这个程序中在建立对象d1(5)时,调用构造函数XCF(intaa=0):a(aa){cout<<"1";},输出1;在建立d2(d1)时,调用拷贝构造函数XCF(XCF&x){a=x.a;cout<<"2";},输出2:在建立newXCF(8)对象时,调用构造函数XCF(intaa=0):a(aa){cout<<"1";},输出1;语句cout<Geta()的功能是输出8;语句deletepd;调用析构函数~XCF(),输出8;当退出程序时,分别释放对象d2、d1,输出55。12、有如下程序:#includeusingnamespacestd;classToy{public:Toy(char*_n){strcpy(name,_n);count++;}~Toy(){count--;}char*GetName0{returnname;}staticintgetCount(){returncount;}private:charname[10];staticintcount;};intToy::count=0;intmain(){Toyt1("Snoopy"),t2("Mickey"),t3("Barbie");cout<A、1B、2C、3D、运行时出错标准答案:C知识点解析:类Toy中包含一个字符数组name和一个静态整型变量count。在程序中首先给类Toy的成员count的赋初始值0,然后在主函数中,定义了三个Toy对象t1、t2、t3,并分别对它们的name字段赋值,在赋值的同时变量count的值加1,所以最后变量count的值等于3。13、若MyClass为一个类,执行“MyClassa[4],*p[5];”语句时会自动调用该类构造函数的次数是()。A、2B、5C、4D、9标准答案:C知识点解析:语句MyClassa[4],*p[5]不仅定义了4个MyClass对象,分别为a[0],a[1],a[2],a[3],而且定义了5个指向MyClass对象的指针变量,分别为*p[0],*p[1],*p[2],*p[3],*p[4],所以共调用MyClass的构造函数4次。14、下列关于析构函数的描述中,错误的是()。A、析构函数可以重载B、析构函数由系统自动调用C、每个对象的析构函数只被调用一次D、每个类都有析构函数标准答案:A知识点解析:一般情况下,析构函数在对象的生存周期即将结束的时候由系统自动调用。在调用完成之后,对象也就消失了,相应的内存空间也被释放。析构函数没有参数,因此析构函数不能重载,一个类中只能定义一个析构函数。15、有如下程序:#includeusingnamespacestd;classMyClass{public:MyClass(){cout<<ˊ*ˊ;}MyClass(MyClass&a){cout<<ˊ#ˊ;}~MyClass(){cout<<ˊ@ˊ;}};intmain();MyClassa;Myclassb(a);return0:}运行时的输出结果是()。A、*@#@B、#@*@C、*#@@D、#*@@标准答案:C知识点解析:程序在执行时,先创建类对象a,输出*,再创建类对象b,输出#,然后再依次调用类对象b和a的析构函数,输出两个@。16、有如下程序:#include#includeusingnamespacestd;classMyString{public:charstr[80];MyString(constchar*s){strcpy(str,s);}MyString&operator+=(MyStringa){strcat(str,a.str);return*this;}};ostream&operator<<(ostream&s,constMyString&z){returns<A、abcB、cdeC、abcdeD、abccde标准答案:D知识点解析:在类MyString中,定义了带参数的构造函数MyString(constchar*s),其作用是把s指向的字符串拷贝到字符组str中。在类中还对运算+=进行重载定义,其作用是把字符串str和a相连接并赋给str,所以在主函数中执行x+=y时,结果为abccde。17、有如下程序:#includeusingnamespacestd;classObj{staticinti;public:Obj(){i++;}~Obj(){i--;}staticintgetVal(){returni;}};intObj::i=0;voidf(){Objob2;cout<getVal();deleteob3;cout<A、232B、231C、222D、221标准答案:D知识点解析:此题考查的是静态成员。本题中,Obi类定义了一个静态数据成员i,并初始化为0.在主函数中,首先定义了1个该类对象ob1,所以构造函数被调用1次,i加1;然后调用函数f(),该函数中又定义了一个对象ob2,此时i再次加1变为2,然后通过函数getval()输出i的值2。f()函数结束,ob2变量被释放,故析构函数被调用了1次,i变成1;回到主函数中,又动态创建了1个对象并让0b3指向它,此后i变成2并输出。最后释放动态创建的对象i变为1,输出1。故最终的输出结果是221。18、有如下类和对象的定义:classConstants{public;staticdoublegetPI(){return3.1416;}};Constantsconstants;下列各组语句中,能输出3.1416的是()。A、cout<getPI();和cout<B、cout<C、cout<getPI();和cout<getPI();D、cout<标准答案:D知识点解析:此题考查的是静态成员函数的引用。getPI()是类Constants的静态成员函数。引用静态成员函数可以有两种形式:一是通过类名直接进行调用,例如类名::静态成员函数名;另一种是用类的任何对象名进行调用其作用仅是通过对象名间接的指出类名,例如constants.getPI()选项D即是这种调用方式。19、己知类Myclass的定义如下classMyClass{public:voidfunctionl(MyClass&c){cout<A、function1B、function2C、function3D、function4标准答案:D知识点解析:funcyion4()函数作为类的静态成员函数,不能直接访问类中说明的非静态成员,即cout<20、有如下程序#includeusingnamespacestd;inti=1;classFun{public:staticinti;intvalue(){returni-l;}intvalue()const{returni+1;}};intFun::i=2;intmain(){inti=3;Funfun1;constFunfun2;___________return0;}若程序的输出结果是:123则程序中下划线处遗漏的语句是()。A、cout<B、cout<C、cout<D、cout<标准答案:A知识点解析:此题考查的是常成员函数。Const关键字可以用于参与重载函数的区分,此时常对象调用常成员函数,一般对象调用一般成员函数,当类中只有一个常成员函数时,一般对象也可以调用该常成员函数。本题中,通过fun1调用value()函数时,是调用前一个,而通过fun2调朋‘value()函数是调用后一个;另外,value()函数中访问的i是类中定义的数据成员i,全局变量i在类中被“屏蔽”。fun1.value()输出i-1=2-1=1;fun2.value()调用后一个value()函数输出i+1=2+1=3;Fun::i是通过类名直接访问类的静态数据成员i的值,即2;所以正确的输出顺序是A选项。21、有如下类定义和变量定义:classA{public:A(){data=0;)~A(){}intGetData()const{returndata;}voidSetData(intn){data=n;}private:intdata;};constAa;Ab;下列函数调用中错误的是()。A、a.GetData();B、a.SetData(10);C、b.GetData();D、b.SetData(10);标准答案:B知识点解析:由题意可知a为常对象,因为常对象不能被更新,所以通过这个常对象只能调用它的常成员函数GetData(),而不能调用其他成员函数SetData(10),因而选项B为本题的正确答案。22、有如下类定义:classTest{chara;constcharb;public:Test(charc){a=c;b=c;}//第1行voidf(chara)const{this->a=a;}//第2行voidg(charb){this->b=b;}//第3行charh()const{returna;}//第4行};编译时没有错误的行是()。A、第1行B、第2行C、第3行D、第4行标准答案:D知识点解析:类Test中的常成员函数h()返回数据成员a的值。国家二级C++机试(类和对象)模拟试卷第4套一、选择题(本题共21题,每题1.0分,共21分。)1、下列关于getValue成员函数的实现中,正确的是()。A、SAMPLE::setValue(intn0){n=n0;}B、voidSAMPLE::setValue(intn0){n=n0;}C、voidsetValue(intn0){n=n0;}D、(intn0){n=n0;}标准答案:B知识点解析:此题考查了成员函数的定义格式。在类外部对成员函数定义时的一般格式为:返回类型类名::成员函数名(参数表){函数体},故此题正确答案为选项B。2、如果派生类以protected方式继承基类,则原基类的protected成员和public成员在派生类中的访问属性分别是()。A、public和publicB、public和protectedC、protected和publicD、protected和protected标准答案:D知识点解析:此题考查的是基类成员在派生类中的访问属性。派生类中的成员不能访问基类中的私彳丁成员,可以访问基类中的公有成员和保护成员。派生类从基类公有继承时,基类的公有成员和保护成员在派生类中仍然是公有成员和保护成员;派生类从基类私有继承时,基类的公有成员和保护成员在派生类中都变成私有成员;派生类从基类保护继承时,基类的公有成员在派生类中变成保护成员,基类的保护成员在派生类中仍然是保护成员。3、有如下程序:#include#includeusingnamespacestd;classXCD{char*a:intb;public:XCD(char*aa,intbb){a-newchar[strlen(aa)+1];strcpy(a,aa);b=bb;}char*Geta(){returna;}intGetb(){returnb;}};intmain(){char*p1=ˊˊabedˊˊ,*p2=ˊˊweirongˊˊ;intd1=6,d2=8;XCDx(p1,d1),y(p2,d2);cout<A、12B、16C、14D、11标准答案:A知识点解析:由类XCD的定义可知,成员函数Geta()返回的是字符串的长度,Getb()返回的是参数b的值。在主函数中strlen(x.Geta())的值等于4,y.Getb()的值等于8,所以输出两者的和为12。4、若AA为一个类,a为该类的私有整型数据成员,getA()为该类的一个非静态公有成员函数,功能是返回a的值。如果x为该类的一个对象,要在类外访问x对象中a的值,正确的访问格式为()。A、AA.getA()B、x.getA()C、x.aD、AA::a标准答案:B知识点解析:要在类外访问x对象中a的值,必须调用类的非静态公有成员函数getA()。5、若有如下类声明classMyClass{public:MyClass(){cout<<1;}};执行下列语句MyClassa,b[2],*p[2]:以后,程序的输出结果是()。A、11B、111C、1111D、11111标准答案:B知识点解析:此题考查的是对象的构造。本题共声明了一个MyClass对象a,一个包含2个MyClass对象的数组b和一个包含2个MycIass对象指针的数组p,所以一共创建了3个Myclass类的对象,即调用了3次构造函数。6、要定义一个引用变量p,使之引用类MyClass的一个对象,正确的定义语句是()。A、MyClassp=MyClass;B、MyClassp=newMyClass;C、MyClass&p=newMyClass;D、MyClassa,&p=a;标准答案:D知识点解析:在选项D中,定义了MyClass类的一个对象a和引用变量p,并且声明p初始化为对a的引用。7、有如下类定义:classMyClass{intx;public:MyClass():x(0),y(0){}intGetX(){returnx;}voidSetX(intxx){x=xx;}inty;};已知obj是类MyClass的对象,下列语句中违反类成员访问控制权限的是()。A、obj.xB、obj.yC、obj.GetX()D、obj.SetX(0)标准答案:A知识点解析:由类MyClass的定义可知,数据成员x属于私有成员,所以只能在类的内部访问。类MyClass的对象obj不能访问类MyClass的私有成员x。8、有如下类定义:classPoint{intx_,y_;public:Point():x_(0),y_(0){}Point(intx,inty=0):x_(x),y_(y){}};若执行语句Pointa(2),b[3],*c[4];则Point类的构造函数被调用的次数是()。A、2次B、3次C、4次D、5次标准答案:C知识点解析:此题考查的是类的构造函数。构造函数在对象创建的时候由系统自动调用。在Pointa(2),b[3],*c[4]语句中:a(2)是定义一个对象并传入构造函数2,所以此时会调垌以此构造函数:b[3]是定义一个包含3个对象的数组,所以构造函数会被调用3次;*c[4]定义的是4个Point类对象指针的数组,它并没有创建任何Point对象,所以不调用构造函数。9、有如下程序:#includeusingnamespacestd;classBase{public:Base(intx=0){cout<A、0B、1C、01D、001标准答案:D知识点解析:此题考查的是类的构造。建立类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序(自左向右)->执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序->执行自身的构造函数。本题中,首先会构造基类Base,调用Base类的构造函数,输出0;然后还定义了一个Base类的对象,再次调用Base类的默认构造函数输出0;最后构造自身,因主函数中传入了构造参数1,所以输出1。故最后输出结果是:001。10、有如下程序:#includeusingnamespacestd;classSample{public:Sample(){}~Sample(){cout<<ˊ*ˊ;}};intmain(){Sampletemp[2],*pTemp[2];return0;)执行这个程序输出星号(*)的个数为()。A、1B、2C、3D、4标准答案:B知识点解析:在main函数中,定义了Sampletemp[2]的一个包含两个对象的数组,还定义了一个*pTemp[2],是包含两个指向类对象的指针的数组,故定义的指针当main函数结束后是不会调用析构函数的,只有包含两个对象的数组temp[2[会调用析构函数.因此只输出两个*。11、有如下程序:#includeusingnamespacestd;classONE{intc;public:ONE():c(0){cout<<1;}ONE(intn):c(n){cout<<2;}};classTWO{ONEone1;ONEone2;public:TWO(intm):one2(m){cout<<3;}};intmain(){TWOt(4);return0:}运行时的输出结果是()。A、3B、23C、123D、213标准答案:C知识点解析:由类TWO的定义可知,其成员为类ONE的两个对象onel和one2。所以在主函数中构建类TWO的对象t(4)时,先后调用类ONE的构造函数ONE():c(0){cout<<1;}和ONE(intn):c(n){cout<<2;}输出12,然后再调用类TWO的构造函数TWO(intm):one2(m){cout<<3;},输出3。12、有如下程序:#includeusingnamespacestd;className{charname[20];public:Name(){strcpy(name,"");c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论