版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象程序设计试卷第1页(共4页)PAGE6试题编号:学年第二学期(试卷)面向对象程序设计(期末)(B卷)(开卷)一、读程题(本大题共5小题,每小题10分,共50分)程序1:#include<iostream>usingnamespacestd;classTdate{public: Tdate(intd,intm,inty) { cout<<"构造"<<endl; day=d; month=m; year=y; }; Tdate(constTdate&oldTdate) { cout<<"拷贝构造"<<endl; memcpy(this,&oldTdate,sizeof(Tdate)); }; ~Tdate(){};private: intday; intmonth; intyear;};intmain(){ Tdated1(1,2,2000); Tdated2(d1);}1、依据程序1的描述画出Tdate类图;2、依据程序1的描述画出d1对象图;3、根据该程序描述画出程序运行的时序图;程序2:#include<iostream>usingnamespacestd;classCurrency{public: Currency&operator++(); Currencyoperator++(inti); operatordouble(); Currency&operator=(Currencyv); Currencyoperator+(Currencyb); Currencyoperator*(intb); Currency(inty,intf); Currency(doubled); Currency(); virtual~Currency(); virtualostream&print(ostream&out); virtualistream&input(istream&inp);protected: unsignedintyuan; unsignedintfen;};//Currency的实现代码略classEuro:publicCurrency{public: Euro&operator=(constCurrency&v); ostream&print(ostream&out); Euro(inty,intf); Euro(doubled); Euro();};//Euro的实现代码略intmain(){ constdoubled=2.34; Euror1(1,23),r2(d),r3; cout<<"r1:\t"; r1.print(cout); cout<<endl<<"r2:\t"<<r2; r3=r2; cout<<endl<<"r3=r2:\t"<<r3; r1++; cout<<endl<<"r1++:\t"<<r1; ++r2; cout<<endl<<"++r2:\t"<<r2; r3=r1+r2; cout<<endl<<"r3=r1+r2:\t"<<r3; r3=r1*3; cout<<endl<<"r3=r1*3:\t"<<r3; /*cout<<endl<<"按照元分的格式输入:"<<endl; cin>>r3; cout<<"输出:\t"<<r3;*/ cout<<endl<<int(1.6)<<endl; cout<<endl<<(int)1.6<<endl;};4、表达式语句r3=r1+r2中,调用了Currency和Euro中的哪些成员函数或重载的运算?5、使用计算顺序图描述表达式r3=r1+r2中的计算顺序及运算结果。、二、编程题(本大题共3小题,每小题10分,共30分)根据下面的类图:1、写出拷贝构造函数Tdate(constTdate&oldTdate)的实现代码,且不能使用memcpy()等库函数;2、重载Tdate的赋值运算;3、该设计使用指针实现Person到Tdate的组合关联,请先描述组合关联的语义,然后编写构造函数Person(charn[],Tdated)和析构函数~Person()的实现代码,并保证使用构造函数时不会发生运行错误。三、开发步骤及任务(本大题共2小题,每小题10分,共20分)1、列出两种编码实现技术,并举例说明其作用。 注:编码实现技术要具体,不能是面向对象技术等抽象程度很高的技术,而应是其中包含的具体技术,如继承、多态、模板等。2、阅读教材【2.5应用举例:员工信息管理】,简述主要开发步骤以及每个步骤完成的主要任务。试题编号:学年第二学期(试卷)面向对象程序设计(期末)(B卷)(开卷)一、读程题(本大题共5小题,每小题10分,共50分)程序1:#include<iostream>usingnamespacestd;classTdate{public: Tdate(intd,intm,inty) { cout<<"构造"<<endl; day=d; month=m; year=y; }; Tdate(constTdate&oldTdate) { cout<<"拷贝构造"<<endl; memcpy(this,&oldTdate,sizeof(Tdate)); }; ~Tdate(){};private: intday; intmonth; intyear;};intmain(){ Tdated1(1,2,2000); Tdated2(d1);}4分1、画出Tdate类图;4分3分3分3分3分对象名3分,冒号1分对象名3分,冒号1分,类名3分3分3分3、画出运行时序图;d1和d2前后位置正确2分;d1和d2前后位置正确2分;d1定义在main()内部1分;d1分配内存和调用构造函数的消息正确1分;d1对象描述正确1分;d1调用析构函数的消息正确1分;d2计分同d1。程序2:#include<iostream>usingnamespacestd;classCurrency{public: Currency&operator++(); Currencyoperator++(inti); operatordouble(); Currency&operator=(constCurrency&v); Currencyoperator+(Currencyb); Currencyoperator*(intb); Currency(inty,intf); Currency(doubled); Currency(); virtual~Currency(); virtualostream&print(ostream&out); virtualistream&input(istream&inp);protected: unsignedintyuan; unsignedintfen;};//Currency的实现代码略classEuro:publicCurrency{public: Euro&operator=(constCurrency&v); ostream&print(ostream&out); Euro(inty,intf); Euro(doubled); Euro();};//Euro的实现代码略intmain(){ constdoubled=2.34; Euror1(1,23),r2(d),r3; cout<<"r1:\t"; r1.print(cout); cout<<endl<<"r2:\t"<<r2; r3=r2; cout<<endl<<"r3=r2:\t"<<r3; r1++; cout<<endl<<"r1++:\t"<<r1; ++r2; cout<<endl<<"++r2:\t"<<r2; r3=r1+r2; cout<<endl<<"r3=r1+r2:\t"<<r3; r3=r1*3; cout<<endl<<"r3=r1*3:\t"<<r3; /*cout<<endl<<"按照元分的格式输入:"<<endl; cin>>r3; cout<<"输出:\t"<<r3;*/ cout<<endl<<int(1.6)<<endl; cout<<endl<<(int)1.6<<endl;};酌情给分酌情给分 1、CurrencyCurrency::operator+(Currencyb),由r1+r2的+运算符调用; 2、Currency::Currency(constCurrency&oldCurrency),由r1+r2调用CurrencyCurrency::operator+(Currencyb)时,实参r2拷贝到形参b的空间时调用,实际调用时间在CurrencyCurrency::operator+(Currencyb)之前; 3、Currency::Currency(inty,intf),由CurrencyCurrency::operator+(Currencyb)中代码returnCurrency(y,f%100)调用,构造一个用于返回的临时对象; 4、Currency::~Currency(),CurrencyCurrency::operator+(Currencyb)结束时,形参b被析构时调用; 5、Euro&Euro::operator=(constCurrency&v),由r3=r1+r2的赋值运算符调用; 6、Currency&Currency::operator=(constCurrency&v),由Euro&Euro::operator=(constCurrency&v)中代码*((Currency*)this)=v调用; 7、Currency::~Currency(),由r3=r1+r2赋值结束后,析构r1+r2返回的临时对象。5、使用计算顺序图描述表达式r3=r1+r2中的计算顺序及运算结果。5个步骤的计算顺序各1分5个步骤的计算顺序各1分;5个步骤的计算结果各1分。二、编程题(本大题共3小题,每小题10分,共30分)根据下面的类图:类作用域3分类作用域3分,构造函数1分Tdate::Tdate(constTdate&oldTdate){每项2分每项2分 month=oldTdate.month; year=oldTdate.year;}2、重载Tdate的赋值运算;返回2分,重载语法2返回2分,重载语法2分,参数2分属性赋值2分属性赋值2分,返回2分 month=v.month; year=v.year; return*this;}3、该设计使用指针实现Person到Tdate的组合关联,请先描述组合关联的语义,然后编写构造函数Person(charn[],Tdated)和析构函数~Person()的实现代码,并保证使用构造函数时不会发生运行错误。2分 面向对象程序设计中,组合关联是描述“整体”与“部分”之间的构成关系,组合关系中部分和整体具有相同生命周期。一旦整体对象不存在,部分对象也将不存在。2分 构造函数Person(charn[],Tdated)实现代码:Person(constcharn[],Tdated){6分,每6分,每行2分 name[sizeof(name)-1]='\0'; birthday=newTdate(d);} 析构函数~Person()实现代码:2分~Person(){2分 deletebirthday;}三、开发步骤及任务(本大题共2小题,每小题10分,共20分)1、列出两种编码实现技术,并举例说明其作用。酌情给分酌情给分继承: 继承是面向对象思想中重要概念,用于描述事物类别之间的包含关系,表示一个类所代表的集合包含另一个类所代表的集合。 在一个继承关系中将代表母集的类称为父类(ParentClass),代表子集的类称为子类(ChildClass),将父类到子类称为继承。 继承最主要的作用就是解决代码冗余问题,实现代码重用,增加软件的可扩充性。 图中,主要声明了4个类及其继承关系,其中,类GraduateStudent继承于类Student,类Student和Teacher继承于类Person,重用了类Person及其两个关联类Tdate和myString的代码。其中,name、birthday、sex等重复的属性和print()等功能相同的方法,只需要在基类Person中定义和实现,减少了代码冗余。 类GraduateStudent中,只调用了Student和Teacher的成员函数,代码中没有出现类Person的信息,好像类Person不存在一样。 这个特点非常有价值,能减少编程中涉及到的知识,也能少打些代码。这正好符合面向对象程序设计追求的目标,将程序员从细节中解脱出来,而将更多精力用于解决实际问题。多态: 多态可以理解成“一个接口,多种实现”,就是同一种事物表现出的多种形态,多态是面向对象思想中重要概念,主要是用来实现动态联编的。 多态把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码。即不用关心某个对象到底是什么具体类型,就可以使用该对象的某些方法,从而实现更加灵活的编程,提高系统的可扩展性。 构成多态的必要条件有3点:存在继承关系;基类存在虚函数,且在派生类中被覆写;存在基类类型的指针或者引用指向派生类对象。 上图中,类Circle和Rectangle继承于类Shape,类Shape的对象中可存储一个点的坐标,类Circle的对象包含了圆的半径以及父类对象中的点,类Rectangle的对象中包含两个点的坐标。根据类Circle和Rectangle的对象中存储的数据,可计算图形的面积。voidcompute(constShape&sp){ cout<<sp.area()<<endl;}intmain(){ Circlec(2.0,5.0,4.0); compute(c); Rectanglet(2.0,4.0,1.0,2.0); compute(t);} 程序中,有三个计算面积的area()成员函数,但从compute()函数的视角,就只有一个计算面积的area()函数,而不关心调用的是哪个area()函数,更不关心是怎样计算的。这个特点能让area()函数的使用者省事省心。如果再增加一种图形,area()函数的使用者也不必修改进行高层计算的代码。模板: 模板是抽象层次更高、重用性更好的一种编程技术,代表了编程技术的一个主要发展方向。模板分为类模板(classtemplate)和函数模板(functiontemplate)。 采用模板编程,可以为各种逻辑功能相同而数据类型不同的程序提供一种代码共享的机制,即将数据类型作为参数传递,这样就不需要为不同的数据类型编写相同的代码。 以类模板为例,类是对某类事物的抽象,用于描述该类事物的共同属性和行为,而类模板是对类的抽象,用于描述多个类的共同属性和行为。 比如定义一个复数类Complex,使用类的两个属性分别存储复数的两个分量a和b。如果对精度要求不高,可选择float类型存储复数的两个分量,其声明代码如下:classComplex_float{ floata; floatb;}; 如果对精度要求较高,可选择double类型存储复数的两个分量,其声明代码如下:classComplex_double{ doublea; doubleb;}; 上面声明的两个类Complex_float和Complex_double都表示数学中的复数,但需要分别为两个类编写复数运算的实现代码,使用类模板则可以用一种表达方法同时声明这两个类,以减少编写工作量。 使用类模板Complex描述复数,其声明代码如下:template<classT>classComplex{ Ta; Tb;}; 在程序中可以使用任意的类作为实际参数替换参数T,例如用float,在预编译时将类模板代码中的所有T替换为float,生成一个类Complex<float>,声明代码如下:classComplex<float>{ floata; floatb;}; 如果对精度要求较高,可使用double类型替换类模板Complex中的模板参数T,在预编译时生成另一个类Complex<double>,其声明代码如下:classComplex<double>{ doublea; doubleb;}; 类Co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年韶关学院单招职业适应性测试模拟试题及答案解析
- 2026年重庆科技职业学院单招职业适应性考试模拟试题及答案解析
- 2026年江苏农林职业技术学院单招职业适应性测试模拟试题及答案解析
- 2026年自贡职业技术学院单招职业适应性考试模拟试题及答案解析
- 2026年浙江警官职业学院单招职业适应性考试模拟试题及答案解析
- 2026年四川商务职业学院单招职业适应性考试模拟试题及答案解析
- 2026年金华职业技术学院单招职业适应性测试模拟试题及答案解析
- 老年人骨质疏松的中医理疗干预
- 医生查房礼仪与患者交流
- 耳鼻喉科疾病诊断与微创手术技巧解析
- 黑龙江省哈尔滨市2025-2026学年九年级上学期期中语文试题(含答案及解析)
- 购物中心应急预案流程图
- 8.1坚守公平 课件 2025-2026学年统编版道德与法治 八年级上册
- 安全员c证考试真题库及答案
- 舟山事业编考试题及答案
- 2025年中小学生趣味百科知识竞赛题库及答案
- 2025年低空经济行业碳排放与环境影响报告
- 银行理财经理先进工作事迹材料
- git内部培训课件
- 图解《常变与长青》通过变革构建华为组织级能力P
- 典型刑事案件汇报课件
评论
0/150
提交评论