2023年面向对象程序设计含答案.docx
填空题(2 0分)1、构造函数是特殊的成员函数,在创建和初始化对象时调用。2、一静态成员是局部于类的成员,它提供一种同类对象的一共享 机制。3、运算符重我的作用是使运算符可以操作自定义的一类对象但重载后运算符 原有的一基本语义不变。4、派生类不能访问基类的私有成员,但可以访问基类的公有成员和保护 成员。5、具有纯虚函数的类称为抽象类。6、Window s应用程序是靠消息一来驱动的,其主函数的重要任务是对窗口进行 初始化工作和一消息循环7、MFC是用消息映射表来实现消息与消息响应函数之间的映射的,MFC通 过_4 个宏来声明和实现消息映射表。8、在文档/视图结构的框架中,视图类_CView 类的对象用来显示数据并接受用 户操作。文档类_C Documen t_对象的作用是存储和管理数据。9、CPaintDC是_CDC_类中最常用的派生类,它只能使用在CV i ew类的 _0nDraw_函数中。10、消息WM_MOUSEMOVE的消息响应函数的函数名为_0nMouseMo v e。11、资源是供Windows应用程序使用的特殊数据,它们驻留在硬盘上的可执行 文献中。常用的资源有菜单、快捷键、图标、位图等。12、内存中的对象可以以文献的形式存储在永久性存储介质中,而当应用程序再把 它从永久性存储介质读入后,该对象能恢复为本来的状态,则该对象称之为 永(持)久性对象 o b ase obj 1 , * p ; der i vedl o bj2; de r ived2 obj3;P=&o b jl; p->w h o ();P=& o bj2; p->w h o();P =&obj3; p >wh o ();O b jl.wh o (); O b j2. w h o(); 0 bj3.who();)结果:b a se c lassB a se c lassBase c 1 assBas e c 1 a ssDeri v edl classDer i ved2 class7、#inclu d e<iostream, h >c 1 as s e xamp 1 e privat e :in t date; s t a tic i nt count;public:e x ample (int y=10):date(y) c out<< " da t e= " d a t e<<endl;Cou n t+ ;st a tic int dis play ()st a tic int dis play () r etu r n c o unt; ;int e x am p 1 e : :coun t =0;void ma i n()ex a nip 1 e el; e x ample e 2 (20);cout<< e 1. Display()<<end 1 ;c out<<e2. Display () << e nd 1 ;cout<<exampl e :: D i s p la y ()<<en d 1;)运营结果:Date=10 Da t e=2 02228、指出下列程序中的错误,并说明理由# includ e < i ostream. h >class St u d e nt p u b 1 ic:void Student () “/构造函数有返回类型错,函数后面多分号voi d Di s p 1 ay() ci n >>n a u m b er ;cout<(姓名 < Vname< V 学号numb e r << e ndl; /字 符串缺少双引号p r i va t e: c h ar * name = non a m e ; /数据成员不能赋值int numb e r=0;/数据成员不能赋值);四、编程题:(20分,每题10分)1、编写一个程序,实现小型公司的工资管理。该公司重要有4类人员:经理、兼职技 术人员、销售员和销售经理。规定存储这些人员的编号、姓名和月工资,计算月工资并显示所有信息。月工资计算办法是:经理拿固定月薪8 ()()0元,兼职技术人员按每小时100元领取月薪,销售员按当月销售额的4%提成,销售经理既拿固定月工资又拿销售提成,固定月工资为5 ()0 0元,销售提成为所管部门当月销售总额的0.5%。规定补充未完毕的代码,使其成为一个完整的程序。#inc 1 u d e <io s tream. h>class Employ e e(p ubli c :e mployee() cout<V”职工编号、姓名”;ci n >> n o>>name; sa 1 a r y= 0;v oid Pay() void Display()P r ot e ct e d : Int n o ; char n a me L 1 0 ; float saiar y ; ;Cla s s t e ch n i c ian: p ubl i c Emp 1 oyee派生技术人员 pub lic:Tec h nic i an() ho u rly r ate= 100.0;void P a y() co u t«name<<“本月工作时数:" cin»workhou r s ;salary=h o url y rat e * wor k ho u rs;void D i splay()cout«”兼职技术人员” VvnameVv”(编号为”noV V")“本月工 资:"<<sala r y« e ndl;)private:补充下面内容f loat h o urlyrate i nt wor k hours; ;Cl a s s Salema n : p u b 1 i c Employe e/派生销售员类 publi c : Salesm an () c o mmra t e= 0 . 0 4f; 销售提成比例void P a y() cou t«n a me<<”本月销售额:“;补充下面内容cin>>s a le s ; salary =sale s * commrate;) v o id Displa y()cout«, 销售员,«nam e vv”(编号为“ V V no«,), 本月工资:"号s alary< < endl; Pro t e ct e d:Fl o at commrate; sal e s; ;Cl a ss Mana ger: vi r tu a 1 p ub 1 ic Emplo y ee p ub 1 ic: Ma n ager() monthl y pay=80 0 0;)补充函数体内容Vo i d Pay() s ala r y=mon t h 1 y p a y; / /补充函数体内容void Dis p la y ()coutv<“经理"<<na m e«M(编号为M«n o << ”厂本月工 资:"<<salary<<end 1 ;P r o t ected: float m o n t hlypay;Clas s SalesM a nag e r : pu b 1 i c M a nag e r, pu b li c S a lesman / /补 充此处类的内容 pu b 1 i c:S a lesManage r () monthly p ay=5() 0 0 ; C o mmra t e =0. 0 05 f; v oi d Pay ( ) cou t <<name<V”所管部门月销售额:“;cin>>sales; sal a r y=monthly p ay+sa 1 es*c o mmra t e;void Display ()co ut<< ”销售经理” vv n ame«” (编号为" n o V<")”本月工资:“<<s a 1 ary<< e nd 1 ; ) v o i d ma i n() mana g e r ml ;Techni c i a n t 1; S a lesm a n s 1; S a lesinanage r sml;m 1 .pay(); m l.di s p 1 a y (); tl.payO; t 1 .di s p 1 ay(); s 1 . pa y (); si. d is p 1 a y(); sm 1 . p ay(); sml.displayO;2、定义一个时间类Time,能提供和设立由时、分、秒组成的时间,并编出应用程序,规 定涉及定义时间对象,设立时间,运营时间上加1秒的操作,输出该对象的时间,输出格 式为XX:XX:XXAM(例如:1 1 : 2 0 : 15AM,上午11时20分1 5秒)(答案略)二、简述题(2 0分,每题5分)(1)简述构成文档/视图结构应用程序框架的4个MFC派生类,并说出它们的功能。答:假如工程名称为MyP门,则MFC A p pW i zar d会自动创建以下4个派生类来 构成应用程序的框架:CF r ame类的派生类CMma i nF r a me> CWinA p p类的派生类 CMyP r j App> CDo c umen t 类的派生类 CMyPrjDoc 和 CMyPr jVi e w。其中,C M y P r jDoc类对象用来存储和管理应用程序中的数据;CM a i n Fr a me对象与CMy P门V i ev 对象构成了应用程序的界面,CM a i nFram e对象只是CMyPrjVi e w对象的容器,ifij C.My PrjView类的对象是用来显示文档与接受用户事件的;CMyPr j App类的对象是应用程 序的全局对象;它是应用程序中对象的容器;负责创建应用程序界面和消息循环。(2)为什么拆分窗口的显示更新必须要同步?文档类的成员函数Updat e Al 1 V i ews的作用是什么?答:由于应用程序的所有拆分窗口显示的应当是同一个文档,所以当文档发生变化 时,该文档所相应的窗口当然要同时更新显示以对的地反映文档的内容。文档类的成员函数Updat e A 1 1 Vi e ws的作用是告知文档所相应的所有窗口同时 进行重绘。(3)如何才干使控件成为窗口的子窗口并且在窗口中可见?按钮控件能发明哪三种不同的形式?答:为了使控件成为窗口的子窗口并且在窗口中可见,两个控制样式的常数使所有 控件都必须使用的,一个是WS_CHILD,另一个是WS VIS I BLE,前者使控件成为应用 程序的子窗口,后者使控件可见。在使用多个常数制定控件样式时,应当用符号|将 其进行连接。按钮控件能发明以下三种不同的形式:下压按钮、复选框、和单选按钮。(4)如何把绘图工具载入设备描述环境进行绘画?请以画笔为例写出执行环节。答:(1)创建画笔:CPen newPen( s ty 1 e, width, c o lor);(2)把画笔载入 DC: CPen * o IdPe n =pDC >Select O bject (& n ewP e n);(3)按规定进行绘画(4)恢复旧画笔 p DC->S e lectOb j ect( o Id Pen);三、阅读下列程序,写出执行结果。(4()分,每题5分)1、#include< i o s tre a m .h>c 1 ass Abe p u b li c :Ab c ()a=0; b=0; c =0;)Abc(int i,int j,i n t k ) a=i; b =j; c = k ;)void g e t(i n t& i ,int&j,int&k) i=a; j=b; k =c; Abe o per a t o r * (Abe obj);p r ivat e :in t a, b, c;);Abe Abe: :operator * (Abe obj)Abe t empobj;tempob j .a= a *obj. a ;t empo b j. b=b*o b j.b;t e mp o bj.c=c * o bj.c;r et u rn tempobj ;v o id main() A b c obj 1 (1, 2 ,3),obj2(5, 5 ,5),obj3;i n t a, b , c;obj 3 =o b j l*obj2;ob j 3.ge t (a, b , c );coutv<”(obj I *obj2): ab ="<V b << t« ,c=,«c«, t,<<endl;(o bj 2 * obj3). g e t(a,b, c);c ob j2* o bj3): t "<<"a=“<VaV V' l'V<''b = "V< b <V' t ,« ,c=n<<c«* t '<<endl;)运营结果:(objl*obj2): a= 5 b =10c=15(obj 2*o b j3): a= 2 5b=5 0c=7 52、# i nclu d e <ios t ream.h>class BAS E 1 p ublic:BASE1( i n t i ) coutVc”调用基类 BASE1 的构造函数:"<ViV<en d 1;);cl a ss BAS E 2 p ub 1 i c:BASE2(in t j) coutv<”调用基类 BAS E2 的构造函数:“<<jv< e ndl;class A: p u b lie BA S El, pu b lie B A SE2 p ublic:A (in t a, int b, i n t c,i n t d): BASE 2(b), BAS E 1 (c), b2(a), bl ( d )cou t VV”调用派生类A的构造函数;”a+b+c+d«end 1 ;private:BASE1 bl;BASE 2 b2;;voi d m a in()Aojb(U, 2 2,3 3,44); )运营结果:调用基类Basel的构造函数:33调用基类Base2的构造函数:22调用基类Ba sei的构造函数:4 4调用基类Base 1的构造函数:1 1调用派生类A的构造函数:1103、# include <iostre a m.h>te m plat e <t y pe n ame T>void f un(T&x, T& y )T t emp;temp=x; x =y; y = temp;v o id fun(d o uble x, int y)d o uble temp;t emp二x; x =y; y=lemp;)vo i d main()( i nt i ,j;i = 3(); j =1();fu n (i, j );c o ul<<" i = n«i« t,«, j= *< <j« end 1 ;dou b 1 e a , b ;a=1.23;b=3. 21;fun( a ,b);coui<<“ a =,?«a<<yV«"b=<<b«endl;d o uble m=10; in t n=30;fun (m,n);c o u t v<"m=''V<m<V't'<<''n="V V n << e n d 1 ;1运营结果:i =10j=3 0a=3. 2 1b=l.23m= 10n=304、#inclu d e <iostr e a m.h>do u bl e x=123.4 56;co u t. w i dth(IO);cout.setf( i o s :de c , i os:: b a s efield);c o u l<<x«endl;cou t .setf(ios:: 1 eft);cou t <<x<< e n dl;cout. w idth( 1 5 );cout. s etf(ios:: right, ios: 1 eft);cout<<x<<end 1 ;cou t .se t f (i o s:sh o w p os);c out<< x <<endl;c o ut<<- x «endl;c out.s e tf (ios:scientific);cout«x<<e n dl;运营结果:1 2 3.4 5 61 2 3.456123.45 6+ 12 3.4 5 6-123.4 564-1. 2345 6 0e+0025、# i n c lude <i o s t ream.h>enum BREED GOLDEN, CAIRN, DANDIE, SHETLAND, DOBERMAN, L AB );c 1 ass Mammalpublic:“/ cons t ruct o r soMamma 1 ():itsA g e( 2 ) , i t s Weight( 5 ) Mamma 1 () / / a cce s sorsi nl G e i A ge () const® re t urn i tsAge; ovoid S et A g e ( i nt age) i tsA g e = age; int GetWeight () cons t r0Vo i d SetW e ight(into/Oth e r m e t h o ds0Voi d Sp e ak()constv oid SI e ep() cons tpro t e c t e d:i n t i t sAge;i nt i t sWe i g h t ;);class Dog : p u blicpub 1 ic:。/ Co n s true torsDog():itsBreed (GOLDEN)。Dog ()e t u r n i t sWeight; we i g ht) i t s Weigh t = w e ight co u t « "Mammal s ound! n u; cout« "shhh. I'm s 1 eepingAn " ; Mammal。/ A cc e ss o rsB R E ED G e tBr e ed() c o n st retu r n its B re e d; vo i d S etB r e ed(BREED bree d ) itsBre e d = breed;)“/ Other m e t h o dsvoid W a g Ta i 1() co n st c o u t « "T a il w a gging.nH; woid B egFor F ood() co n s t cout << "Be g g ing for f o o d . nu; priva t e :BREED i t sBreed;;in t m a in() D og fido;fi d o .Spe a k ();。f id o .WagTail ();eco u t << " F ido is " << f ido.Get Age() « '* years oldnM;»re t urn 0;)运营结果:Mammal sou n d!T a il w a gging .Fi d o i s 2 y ea r s ol d6、#include<iost ream.h>cl a ss Basepu b i c: vo i d who ( ) cout«,Base c 1 ass?,«en d I;classDe r i vedl: p ublic B asepu b lie: voi d w h o() co ut«MDerived 1 cl a ssM<<endl;;c 1 ass d e rived2: public Basepu b lie: voi d who()cout<<,Deri v ed2 c 1 a s s ”<<endl;