《C++程序设计模拟试卷(六).doc》由会员分享,可在线阅读,更多相关《C++程序设计模拟试卷(六).doc(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C+程序设计模拟试卷(六)一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。1. 当一个类的某个函数被说明为virtual时,该函数在该类的所有派生类中()A. 都是虚函数B. 只有被重新说明时才是虚函数C. 只有被重新说明为virtual时才是虚函数D. 都不是虚函数答案:A解析:在基类声明为virtual的函数为虚函数,在派生类中只要有相同的函数(函数名相同、返回值相同、形参类型和个数相同)即使不用virtual说明,也都是虚函数。2. 以下基类中的成员函数表示纯虚函数的是 ()
2、A. virtual void vf(int)B. void vf(int)=0C. virtual void vf()=0D. virtual void yf(int)答案:C解析:纯虚函数是特殊的虚函数,没有函数体,形式为:virtual返回类型函数名(形参列表)0;因此选C项。3. 下面对静态数据成员的描述中,正确的是()A. 静态数据成员可以在类体内进行初始化B. 静态数据成员可以直接用类名或者对象名来调用C. 静态数据成员不能用private控制符修饰D. 静态数据成员不可以被类的对象调用答案:B解析:静态成员可用类名或者对象名来调用,静态数据成员必须在类外进行初始化。静态成员可以用
3、public、private和protected修饰。所以选B项。4. 所谓数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是()A. 类B. 对象C. 函数体D. 数据块答案:A解析:类即数据和操作的组合体,数据是类的静态特征,操作是类具有的动作。5. 类B是类A的公有派生类,类A和类B中都定义了虚函数func(),p是一个指向类A对象的指针,则p-A:func()将()A. 调用类A中的函数func()B. 调用类B中的函数func()C. 根据p所指的对象类型而确定调用类A中或类B中的函数func()D. 既调用类A中函数,也调用类B中的函数答案:A解析:指
4、向类成员指针的使用,A:func()是明确调用A类的func函数,所以不管p指向基类或者派生类对象,都执行基类虚函数。注意p-A:func()和p-fun();进行区分。如果使用p-fun(),因为p指向派生类对象,由动态多态性可知要调用派生类的虚函数。6. 在面向对象的程序设计中,首先在问题域中识别出若干个 ()A. 函数B. 类C. 文件D. 过程答案:B解析:面向过程的和面向对象都具有、函数、文件和过程这些概念,而面向对象程序才有类和对象的特征。所以选择B。7. 在下列成对的表达式中,运算结果类型相同的一对是()A. 7.02.0和7.02B. 52.0和52C. 7.02和72D. 8
5、2和6.02.0答案:A解析:小数默认的类型为double类型,整数除以整数结果是取整的结果。A、B、C和D项的第一项分别是double、double、double和int类型的,第二项分别是double、int、int和double类型,所以选择A项。8. 下列不具有访问权限属性的是()A. 非类成员B. 类成员C. 数据成员D. 函数成员答案:A解析:类成员包括成员函数和数据成员,都可以使用访问权限public、private和protected来修饰,而普通的变量不能使用访问权限来说明。9. 以下有关继承的叙述正确的是 ()A. 构造函数和析构函数都能被继承B. 派生类是基类的组合C.
6、派生类对象除了能访问自己的成员以外,不能访问基类中的所有成员D. 基类的公有成员一定能被派生类的对象访问答案:C解析:构造函数和析构函数不能被派生类继承,A项错误。派生类是基类的扩展,B项错。派生类可以访问基类公有和保护类型的成员,不能访问基类私有成员。D项基类是公有的成员,若采用私有继承,派生类对象不能直接访问。选择C项。10. 下列有关模板和继承的叙述正确的是 ()A. 模板和继承都可以派生出一个类系B. 从类系的成员看,模板类系的成员比继承类系的成员较为稳定C. 从动态性能看, 继承类系比模板类系具有更多的动态特性D. 相同类模板的不同实例一般没有联系,而派生类各种类之间有兄弟父子等关系
7、答案:D解析:类是相同类型事物的抽象,具有不同的操作。而模板是不同类型的事物,具体相同的操作的抽象。类模板的实例化后,各个对象没有任何关系。而类对象是通过派生、继承等关系的关系。11. 适宜采用inline定义函数情况是()A. 函数体含有循环语句B. 函数体含有递归语句C. 函数代码少、频繁调用D. 函数代码多、不常调用答案:C解析:内联函数具有程序代码少、频繁调用和执行效率高的特征,所以选择C项。12. 要采用动态多态性,说法正确的是()A. 基类指针调用虚函数B. 派生类对象调用虚函数C. 基类对象调用虚函数D. 派生类指针调用虚函数答案:A解析:使用基类的指针或引用,由指向或引用的对象
8、来决定调用不同类的虚函数。所以选择A。13. C+类体系中,不能被派生类继承的有()A. 转换函数B. 构造函数C. 虚函数D. 静态成员函数答案:B解析:构造函数不能被继承,而转换函数、虚函数和静态成员函数都可以被继承,所以选择B项。14. 下列不是描述类的成员函数的是()A. 构造函数B. 析构函数C. 友元函数D. 拷贝构造函数答案:C解析:构造函数、析构函数、拷贝构造函数都是特殊的成员函数,友元则不是成员函数。所以选择C项。15. 下列不能作为类的成员的是()A. 自身类对象的指针B. 自身类对象C. 自身类对象的引用D. 另一个类的对象答案:B解析:类的定义,如果有自身类对象,使得循
9、环定义,B项错误。在类中具有自身类的指针,可以实现链表的操作,当然也可以使用对象的引用。类中可以有另一个类的对象,即成员对象。所以选择B选项。16. 下列不是描述类的成员函数的是()A. 构造函数B. 析构函数C. 友元函数D. 拷贝构造函数答案:C解析:友元函数不是类成员,只是它可以访问类中的成员。17. 关于对象概念的描述中,说法错误的是()A. 对象就是C语言中的结构变量B. 对象代表着正在创建的系统中的一个实体C. 对象是类的一个变量D. 对象之间的信息传递是通过消息进行的答案:A解析: A对象在C中才有,包括数据和操作两项,而C中的变量只有数据,没有操作。所以A项错误。18. 派生类
10、的构造函数的成员初始化列表中,不能包含()A. 基类的构造函数B. 基类的对象初始化C. 派生类对象的初始化D. 派生类中一般数据成员的初始化答案:C解析:派生类的构造函数的成员初始化,包括基类成员、基类对象成员和派生类成员。因为本身就是初始化定义的对象,在构造函数中再进行该类对象的初始化产生了循环定义,或者类中不能包括本身类的成员对象。所以选择C项。19. 关于new运算符的下列描述中,错误的是()A. 它可以用来动态创建对象和对象数组B. 使用它创建的对象或对象数组可以使用运算符delete删除C. 使用它创建对象时要调用构造函数D. 使用它创建对象数组时必须指定初始值答案:D解析: ne
11、w创建的对象数组不能指定初始值,所以调用无参的构造函数,选择D项。20. 假定一个类的构造函数为A(int aa,int bb)a=aa+;b=a*+bb;,则执行A x(4,5);语句后,x.a和x.b的值分别为()A. 4和5B. 4和20C. 4和24D. 20和5答案:C解析:执行构造函数将数据成员进行赋值,aa+是后加,先赋值a4,+bb,bb变量值先自加为6,再与a相乘,所以b24。二、填空题(本大题共20小题,每小题1分,共20分)请在每小题的空格中填上正确答案。错填、不填均无分。1. 在C+中,编译指令都是以_(符号)开始。答案:#C+的源程序可包括各种编译指令,以指示编译器对
12、源代码进行编译之前先对其进行预处理。所有的编译指令都以#开始,每条指令单独占用一行,同一行不能有其他编译指令和C+语句(注释例外)2. 在函数前面用_保留字修饰时,则表示该函数表为内联函数。答案: inline解析内联函数,用来提高程序运行速度。在类内部定义的函数也是内联函数。3. 执行下列程序int a=21,j=16;cout.setf(ios:hex);couta;cout.unsetf(ios:hex);coutjendl;程序的输出结果是_。答案: 1516解析a21以十六进制输出,j=16以十进制输出。4. 在单继承和多继承方式中,面向对象的程序设计应尽量使用_继承。答案:单解析多
13、继承是单继承的扩展,且多继承易产生二义性等问题。5. 函数模板中紧随template之后尖括号内的类型参数都要冠以保留字_。答案: class解析类模板的使用。template ,也可以引入多参数的如:template 6. 在C中,访问指针所指向的对象的成员使用_运算符。答案:或.解析使用指针访问成员有两种方法:成员运算符“.”或指向运算符“.”。7. 定义类的动态对象数组时,系统只能够自动调用该类的_构造函数对其进行初始化。答案:无参解析使用new创建对象数组,调用无参构造函数。8. 局部对象和全局对象中,在同一程序中_生存期最长。答案:全局对象变量或对象的生命期或者作用域的不同,全局对象
14、生命期长。9. this指针始终指向调用成员函数的_。答案:对象this指针是隐藏的指针,它指向调用函数的对象。10. 派生类的主要用途是可以定义其基类中_。答案:不具有的成员解析继承的特点,扩充基类,即在派生类中增加基类不具有的成员。11. 在用class定义一个类时,数据成员和成员函数的默认访问权限是_。答案: private解析定义类时的成员默认为私有,而结构体则是公有。12. 使用new为int数组动态分配10个存储空间是_。答案: new int10;解析new delete动态开辟空间和删除空间。new int10,注意不要写成newint(10),使用小括号只能开辟一个空间,使用
15、10来初始化该值。13. 类模板用来表达具有_的模板类对象集。答案:相同处理方法解析模板特点是不同的数据具有相同的处理方法的抽象。14. 如果通过同一个基类派生一系列的类,则将这些类总称为_。答案:类族解析单继承方式派生的众多的类。15. 面向对象的四个基本特性是多态性、继承性、和封装性_。答案:抽象解析考察面向对象的四个特征。程序由一组抽象的对象组成,一组对象的共同特征抽象出类的概念,类是对象的抽象,对象是类的实例。封装即将数据和操作紧密结合提供访问的接口,外部通过接口实现访问数据,提供安全性。继承继承解决了类的扩展性。多态性不同对象调用相同的函数名,但调用不同的函数,实现不同的功能,解决了
16、接口统一的问题。16. 所有模板都是以_关键字和一个形参表开头的。答案: template解析类模板,函数模板都要使用template这一关键字。17. 在C+语言中,访问一个对象的成员所用的成员运算符是_。答案:.解析成员运算符“.”,如果是指针可以使用“-”。18. 开发一个C+语言程序的步骤通常包括编辑、_、连接、运行和调试。答案:编译解析vc开发过程,要经过编辑、编译、连接和运行四个步骤,与其它高级语言相同。19. 执行下列代码string str(HelloC+);coutstr.substr(5,3);程序的输出结果是_。答案: C+解析substr取子字符串,第1个参数表示要截取
17、子串在字符串中的位置,第2个表示取多少个字符。20. 定义_函数时,应在参数个数或参数类型上有所不同。答案:重载解析重载函数要求同名函数具有相同的功能,而只能是函数类型、参数个数或参数顺序不同。系统将根据同名函数的这些不同之处来选择其对应的实现。三、改错题(本大题共5小题,每小题4分,共20分)1. #include #include #include using namespace std;class Apublic:A(const char *na)strcpy(name,na);private:char name80;class B:public A public:B(const cha
18、r *nm):A(nm)void show();void B:show() coutname:nameendl;void main() B b1(B);b1.show();答案:private:因为name如果是私有的,在派生类中无法访问,而基类没有提供成员函数来访问name,所以更改name访问权限为公有或保护,这样对于派生类来说是透明的。修改public:或protected:2. 下面的程序有错误,请修改。#include class Aprivate:int a;public:void func(B &);A(int i)a=i;class Bprivate:int b;friend
19、void A:func(B &);public:B(int i)b=i;void A:func(B& r)a=r.b;coutaendl;void main() B bt(3);A at(10);at.func(bt);答案:修改class B;class A解析class A类A中使用B类中的成员增加对B声明。3. #include class Testprivate:int x,y=20;public:Test(int i,int j)x=i,y=j;int getx()return x;int gety()return y;void main()Test mt(10,20);coutmt
20、.getx()endl;coutmt.gety()endl;答案:int x,y=20;在类内部不能对数据成员直接赋值。修改int x,y;4. #include class Aprivate:int x,y;public:void fun(int i,int j)x=i;y=j;void show()coutx yendl;void main()A a1;a1.fun(2);a1.show();答案:void fun(int i,int j)调用时有一个参数,形参有两个,可以使第二个带默认值。修改void fun(int i,int j0)5. #include class Aprivate
21、:int x;protected:int y;public:A(int i,int j)x=i;y=j;class B:public Apublic:B(int a,int b):A(a,b)void show()coutx,yendl;void main()B b(8,9);b.show();答案:private:在基类中是私有成员,即使采用公有派生,但在派生类无法访问。修改public:或protected:四、完成程序题(本大题共5小题,每小题4分,共20分)1. 完成下面类中成员函数的定义。#include class vehicleprotected:int size;int spe
22、ed;public:void set(int s)speed=s;_get()return speed/10;class car:public vehicle public:int get()return speed;class truck:public vehicle public:int get()return speed/2;int max(_) if(v1.get()v2.get()return 1;elsereturn 2;void main() truck t;car c;t.set(160);c.set(80);coutmax(t,c)endl;/此结果输出为2答案:virtua
23、l int,vehicle &v1,vehicle &v2解析在基类和派生类都有get函数,输出结果是2,只有当这两个不同类型的对象,调用不同类的get函数,才能使结果为2,这就是多态性。所以将基类get定义为虚函数。max函数使用基类对象的引用的方法来实现。2. 完成下面类中成员函数的定义。#include #include using namespace std;class strprivate:char *st;public:str(char *a)set(a);str & operator=(_)delete st;set(a.st);return *this;void show()c
24、outstendl;str()delete st;void set(char *s)/初始化st_strcpy(st,s);void main()str s1(he),s2(she);s1.show(),s2.show();s2=s1;s1.show(),s2.show();答案:str &a,st=new charstrlen(s)+1;解析对“”运算符进行重载,调用时s2=s1,都是对象,所以形参使用对象的引用,不要使用对象作为形参(产生临时对象)。使用strcpy进行字符的复制,st必须有一定的空间,空间是strlen(s)+1(0作为结束符,strlen得到的长度不包括结束符)。3.
25、下面程序段用来求三角形的面积,首先判断三边不符合组成三角形时,返回-1,符合时输出三角形面积。#include #include double area(double a,double b,double c)if(_)return -1;elsedouble ar,l;l=(a+b+c)/2;ar=sqrt(l*(l-a)*(l-b)*(l-c);return ar;void main()double i=0,j=0,k=0;coutijk;double s=area(i,j,k);if(s0)cout不是三角形c|a+cb|b+ca,coutsendl;解析三角形组成规则:两边之和大于第三边
26、。s0不是三角形,是则输出s。4. 在下面程序横线处填上适当内容,使程序执行结果为:S=2S=5S=9#include void sum(int i)static int s;_;couts=sendl;void main (void)int i;for (i=0;_)sum(i);答案:s=s+i+2;,i3,i+解析根据结果和调用形式,得出规律。注意静态成员能保留上次运行的结果。循环了3次,退出循环的条件。5. 下面是一个三角形三边,输出其面积C+程序,在下划线处填上正确的语句。#include #include void area()double a,b,c;coutc&a+cb&c+b
27、a)double l=(a+b+c)/2;_coutThe area is:sendl;elsecoutErrorabc;,double s=sqrt(l*(l-a)*(l-b)*(l-c);解析输入三个边的长度,由公式得出三角形的面积double s=sqrt(l*(l-a)*(l-b)*(l-c);五、程序分析题(本大题共2小题,每小题5分,共10分)1. 给出下面程序输出结果。#include class exampleint a;public:example(int b=5)a=b+;void print()a=a+1;cout a;void print()constcoutaendl
28、;void main()example x;const example y(2);x.print();y.print();答案:62解析x是普通对象,调用普通的print函数;而y常对象,调用常成员函数。2. 给出下面程序输出结果。#include class Apublic:A()coutA 构造函数n;fun();virtual void fun()coutA:fun() 函数n;class B:public Apublic:B()coutB构造函数n;fun();void fun() coutB:fun() calle函数n;void main()B d;答案:A构造函数A:fun()函
29、数B构造函数B:fun()calle函数解析定义派生类对象,首先调用基类构造函数,调用A类中fun(),然后调用B类的构造函数,在调用B的fun函数。六、程序设计题(本大题共1小题,共10分)1. 写一个程序,定义一个抽象类Shape,由它派生3个类:Square(正方形)、Trapezoid(梯形)和Triangle三角形。用虚函数分别计算几种图形面积、并求它们的和。要求用基类指针数组,使它每一个元素指向一个派生类对象。#include class Shapepublic:virtual double area()const=0;答案:class Square:public Shapepub
30、lic:Square(double s):side(s)double area() constreturn side*side;private:double side;class Trapezoid:public Shapepublic:Trapezoid(double i,double j,double k):a(i),b(j),h(k)double area() constreturn (a+b)*h/2);private:double a,b,h;class Triangle:public Shapepublic:Triangle(double i,double j):w(i),h(j)
31、double area() constreturn(w*h/2);private:double w,h;void main()Shape *p5;Square se(5);Trapezoid td(2,5,4);Triangle te(5,8);p0=&se;p1=&td;p2=&te;double da=0;for(int i=0;iarea();cout总面积是:daendl;_14 拟_ 卷 六 :面 ;) -=+ ; 0 ), ) )( * ( ; () ) : , ;*+ ) , ( ; ) (: 0= ( 象类个指元数指基。们它、形计数虚形三 梯 方 它, 类个,序写分分,共大计数
32、函的函构 用, 中用数类用先象派函 ( 函函) 函函; ( ; 数 ( ) ;) 函构 ( : ;函 :( ;( 数 ( 果出程出数数用调常数 普,象普 ) )( ) ( ; ) ; ;)( + + _: ( . 句的上处在序 其输边三面件件 。结次留成注律出形果根+, + ) _ _ . =为果序使当填横面 出是三不 三和两:组 | _ :三输0 =0 ( ) ()(* )+ _ , ( . 积形时符-返时组符边首,的来序下)束包长得 符作 ( ,间一必 的字 使。临生为象,用象使所对都=时,重算” ) ;( ,( =) ) ) ( ) _ 化/* ; )(; )( _( ) ( 义的员类成
33、现来的引使函 函义 基将态是这果才函 调,的同两只是结数函都生基 & 为为此/ ,(.(_ ;/ ; ; )(_; 义义员成下分0分 题共题题 : 问访生但派用即,私类 ) ) ( ; , )() ( : ;= 0 值认个以,参形一用) , ( ) ) ( ; ( ;= ( , . # 值接成数部在0, ) ) ( ; ( ; ( ; 0 , #明声增的 使 修) )0) ( :;= ) ;= ) 改请错程下 的透来派对,或限权 所访数成有没问无中,私如 因 )( )( ( ) )() ;) 分 分题,共大题现的其来处不的据将不序或数型函只而功具数求数重同不型数数在时_义符少多表第位符串截示个
34、,符 + _结) ( . 使针果”符员:_算成用成个一,+ 字键 使板函模 的开表和键_以有题的口决解同实函同调名相调同不性的了解。安提问实,口问提密和数封实的对抽象类出出同的一成的象由征四的向抽_封性、态特个象对 类类的式单类_为类,类一派一通 象的理同具的不板方同集对板的_来模值该初0间个开只使) 成要注 。空间空动 _空个0动数 有有体而有认成定 _是访数成成数个义 用员员具加类生,扩特的成具_类定以用类派象对用向针的针 对_数员指针 长期象全的作或生对对全长期生中一,象和部数函无,组建 无化初进函构的用调只统组态的定”“符或.运:法有问针或符算_使象向所访 ,. 数多引也 用模 _保冠
35、都类内之 随中函题题义易继展扩是承:承承_使设的对,承和单出制以=出进以 _结 ) : ( ) :意数类执象对派向向管数函 类确( :用针员向:函函类,数 既( 的或类定确对所 ( 的用调( 的 (将 -指象 指 ) 数义中和,派有是 作动具操,静是,的和即:据数数数对 (实实体成,装关据这据将装封项选所 、 用静。始进必员静调名或类成静:调对被不成态修制 员成调来者类接可成始初内以员数(是正中的据面项 ;形形函类 为形数,虚特函纯: = =)( (是数示函的基以数函也说 不使数和形、名数函相只生,虚数 类在:函不函虚 明被只函虚明说只函是(中有类数该 为说个某当分均均多选号的写码请求题合项备四列每分,题小小题大选