面向对象程序设计习题_第1页
面向对象程序设计习题_第2页
面向对象程序设计习题_第3页
面向对象程序设计习题_第4页
面向对象程序设计习题_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、1面向对象程序设计中得数据隐藏指得就是参考答案为:DA。输入数据必须输入保密口令B、数据经过加密处理C.对象内部数据结构上建有防火墙D.对象内部数据结构得不可访问性解析输入数据必须输入保密口令与数据经过加密处理都不就是面向对象程序设计得特征对象内部数据结构上也不可能建有防火墙,所以它们都不就是面向对象程序设计中所指得数据隐藏、面向对象程序设计系统中得封装单位就是对象,对象之间只能通过接口进行信息交流,外部不能对对象中得数据随意地进行访问,这就造成了对象内部数据结构得不可访问性,也使得数据被隐藏在对象中、这就就是面向对象程序设计中得数据隐藏所指。2下列各项中符合函数重载必须满足得条件得就是参考答

2、案为:DA。必须有不同得参数个数B、对应得参数类型必须不相同C.A与B必须同时满足D、A与B只要满足一个即可解析我们知道,在同一个作用域中,要实现函数重载必须满足得条件得就是:有不同得参数个数;或者对应得参数有不相同得数据类型,即与中只要有一个满足就可以了。当然两者都满足更好,但这不就是必须得、3.下列带缺省值参数得函数说明中,正确得说明就是参考答案为:AAintFun(intx,inty=2,intz=3);B、intFun(intx=1,inty,intz=3);C.intFun(intx,inty=2,intz);D。intFun(intx=1,inty,intz=3);解析在带缺省值参

3、数得函数说明中,正确得说明应该就是无缺省值得参数依次排列在参数表得左边,排完无缺省值得参数后,再依次排列带缺省值得参数、从所给出得四个选项来瞧,只有"intFun(intx,inty=2,intz=3)”符合这条规定,其它得都不符合。4.有如下得对类“CSample”得说明,其中()就是错误得。classCSample参考答案为:AA.inta=23;B、CSample();pub1ic:C.CSamp1e(intval);D.CSample();解析在上面又'类“CSample”说明中,"CSample()"与"CSampe(intval)”就

4、是该类重载得构造函数、“CSample()”就是该类得析构函数,这三个语句都就是正确得。错误得语句就是“1nta=23”,因为它违反了在类得声明(不管就是引用性声明,还就是定义性声明)中都不能以赋值表达式得形式给它得数据成员进行初始化、5、已知类A中得一个成员函数得说明如下:voidSet(A&a);则该函数得参数“A&a”得含义就是参考答案为:CA、指向A得指针为aB。将变量a得地址赋给类AC.类A对象引用a用作函数得形参D.变量A与a按位与后作函数参数解析因为A就是一个类,所以“A&a”表示a就是类A得对象,但因为对象a得前缀了符号“&”,则“&a&

5、quot;表示就是类A得对象引用。所以“A&a”得含义就是类A对象引用a用作函数得形参。6.若类A与类B得定义如下:classApublic:inti,j;voidget();c1assB:Ainti,j;protected:intk;public:voidmake();;voidB:make()k=i*j;则其中()就是非法得表达式。参考答案为:DA。voidget();Bintk;C、voidmake();D、k=i*j;解析1对于给定彳#四项中,前三项都就是正确得,只有第四项就是错误得、因为,类B就是类A得私有派生类(缺省访问类型),所以A中得公类型得数据成员在类B中成为了私有数

6、据成员,但函数“voidB:make()”既然就是类B得成员函数,则既可访问类A中得公有数据成员,也能访问类B中得私有数据成员,则表达式“k=ij;”造成了访问得二义性,即其中得i与j,到底就是取自类A呢?还就是取自类B呢?7.下面得主程序中,语句()就是错误得、classAinti;public:virtualvoidfun()=0;A(inta)i=a;classBintj;public:voidfun()cout"B:funn”;B(intb,intc):A(b)j=c;voidmain()参考答案为:AA.Aa(5);B.A*pa;CoBb(7);D.B*pb;解析在类A中,

7、函数“virtualvoidfun(尸0”为纯虚函数,因此,类A为抽象类、作为抽象类,它就是不能被用来定义具体对象得,而语句“Aa(5);”恰恰就是定义抽象类得对象得,所以它就是错误得参考答案为:C8. 拷贝(复制)构造函数得作用就是A.进行数据类型得转换B、用对象调用成员函数C、用对象初始化对象Do用一般类型得数据初始化对象解析进行数据类型得转换与用一般类型得数据初始化对象都就是一般构造函数得功能、用对象调用成员函数不用构造函数,只要用“对象名.成员函数名”即可。所以拷贝(复制)构造函数得作用,只能就是用对象来初始化对象。9、下列说法中,正确得说法就是参考答案为:BA。所有得运算符都能被重载

8、B。运算符被重载时,它们得优先级与结合性不会改变C.当需要时,我们可以自定义一个运算符来进行重载D.每个运算符都可以被重载成成员函数与友元函数解析当重载运算符时,不就是所有得运算符都能被重载,有几个运算符就是不能被重载得,如三元运算符“?:”、.、:、#等;也不就是每个运算符都可以被重载成成员函数与友元函数,如运算符=、()、与都只能被重载成成员函数;无论何时,都不能自定义运算符来进行重载,也即重载只能对已有运算符进行;但就是运算符被重载时,它们得优先级与结合性不会改变。1 0.下面对结构或类中成员得访问中,不正确得访问就是参考答案为:AA、*pointer.sa1ary;(其中pointer

9、为指向类对象得指针)B.pointer->salary;C.x=worker.sa1ary;(其中worker为具有类类型得对象)D、Location&rA=A1;intx=rA。GetX();(Location为已定义得类,A1为对象)解析因pointer为指向类对象得指针,所以“pointer>sa1ary”就是正确得访问数据成员得形式;因worker为具有类类型得对象,所以“w。rker、salary”也就是正确得访问数据成员得形式;因Location为已定义得类,A1为对象,所以“Location&rA=A1;intx=rA、GetX();表示以对象A1初始

10、化对象引用rA,然后由对象引用rA调用成员函数GetX()给变量x赋彳1,这样得访问成员函数得形式也就是正确得;“*Pointer。salary;"中,因为运算符.得优先级高于运算符*'得优先级,所以相当于“*(pointer。salary);",那正确得形式应该就是“*(pointerfsalary);"。故“*pointer、salary"就是不正确得访问。11 C+对C语言作了很多改进,即从面向过程变成为面向对象得主要原因就是()DA.增加了一些新彳#运算符B、允许函数重载,并允许设置缺省参数C、规定函数说明符必须用原型D、引进了类与对象得

11、概念12 .下列符号不能组成标识符得就是(A)A、连接符B、下划线C.大小写字母D。数字字符13 .类型修饰符unsigned不能修饰(D)A.charBointClongintD.float14 .在inta=3,int*p=&a;中,*p得值就是(D)A变量a得地址值B.无意义Co变量p得地址值D。315、下列关于指针得操作中,错误得就是(D)A、两个同类型得指针可以进行比较运算B。可以用一个空指针赋给某个指针C、一个指针可以加上两个整数之差D、两个同类型得指针可以相加二,填空题不写解答过程,将正确得答案写在每小题得空格内。错填或不填均无分。1 .面向对象程序设计中得多态性包括静态

12、多态性与动态多态性,前者由机制支持,而后者则由机制支持。答:函数重载、虚函数解析静态多态性又称编译时多态性,调用何函数应该在编译之前就知道了,所以必须由函数重载机制来支持。动态多态性又称运行时多态性,调用何函数只有在运行时才知道,所以由虚函数(与指针或引用)机制来支持。2 .由charconst*str="stucture"所以定义得指针称为,关键字const所修饰得就是。答:指向常量得指针、指针所指得字符串解析根据由在修饰符"const”中位置得不同,它所修饰得对象也不同,"const"表示所修饰得就是指针所指得常量,该指针称为指向常量得指针

13、;“*const”表示所修饰得就是指针本身,该指针称为常指针;“*const*”则表示所修饰得就是指针本身与指针所指常量,该指针称为指向常量得常指针。3 .引入虚基类得目得就是为了解决多重继承中得_前前_与_前_前问题、答:二义性、多占用空间解析在允许多重继承时可能出现两个问题,第一个就是公有派生类中得成员通过不同基类调用它们上一级公共基类得同一成员,这就产生了调用得二义性;每一个基类都为它们得上一级公共基类存有备份,这就引起了公共基类得重复存储,也就多占了存储空间。引入虚基类得目得就是为了解决多重继承中得这两个问题。4 .构造函数与析构函数所调用得虚函数就是前前_前前_得函数,因此调用时实现

14、得就是_前前前_前联编。答:所在类、静态解析在生成派生类得对象时,先调用基类得构造函数生成基类对象,再调用派生类得构造函数来生成派生类对象。所以当在构造函数中调用虚函数时,当调用基类得构造函数时,此时派生类还未生成,所以它只能调用自己得虚函数;调用派生类构造函数时,它也只能调用自己得虚函数,因为虚函数得调用就是不能由派生类调用基类得。在析构派生类对象就是时,先调用派生类得析构函数析构掉派生类对象,再调用基类得析构函数来析够掉基类得对象。所以当在析够构函数中调用虚函数时,派生类得析构函数调用得就是它自己得虚函数(原因同构造函数),基类得析构函数调用得也就是它自己得虚函数,因为此时派生类对象以已被

15、析构掉了。由上可见,当构造函数与析够函数调用虚函数时,它们调用得都就是自己类得函数,因此调用时实现得就是静态联编。7.说明一个const成员函数(又称常量成员函数)得方法就是,将const写在之间,而且它修饰得就是_前_前_前_。答:函数头与函数体、this指针解析为了说明一个常量成员函数得方法就是,将const写在函数头得右圆括号)与函数体得左花括号''之间,而且它修饰得就是对象所属得this指针。表示该函数不能修改它所在对象中得数据成员得值。20.对某个运算符得重载,实际上就是用关键字前_前前_与该运算符组成一个运算符函数,而且该运算符函数得返回类型不能就是_前_前_前_得

16、。答:opeaater、void解析1对某个运算符得重载,实际上就是用关键字operater与该运算符组成一个运算符函数,而且该运算符函数得返回类型不能就是无类型得,即不能就是void得、三改错题1.分析下列程序中得错误,并说明出错原因、#inc1udec1assbaseconstintn;public:base()coutvv“Initializingdefau1tn"base(intm)cout"Initializin"n=m;base()cout“Destroyingn"voidmain()basex(1);basey=x;答:(1)n=m;con

17、st数据成员不以该形式赋值(2)错误处basey=x;,以对象初始化对象解析1(1)作为const数据成员n不能用赋值表达式得形式为其赋初值,必须在定义构造函数时在函数头中以“base(intm):n(m)”形式来初始化。(2)basey=x;语句中'='不就是赋值得意思,而就是初始化得意思。即在定义类base得对象y时,以对象x给它初始化,相当于basey(x);、但就是以对象初始化对象时,必须调用拷贝构造函数才行、因程序中没给出拷贝构造函数,也不能调用系统得缺省拷贝构造函数,因用户给出了构造函数后,再也不能调用系统提供得任何缺省构造函数、所以,basey=x;就是错误得。2

18、、分析下列程序中得错误,并说明出错原因、includeclassAintx;public:A(inta)x=a;fun();virtua1voidfun()=0;classB:publicApublic:B(intb):A(b)voidfun();voidmain()Aaa(5);Bbb(8);答:1)Aaa(5);抽象类不能定义对象解析(1)在构造函数“A(inta)”调用了纯虚函数“fun()”,因构造函数调用虚函数就是静态联编,即调用得就是它自己类得虚函数、在此调用得就是纯虚函数,它只被说明,而未定义,所以不可能被执行,因此出错。(2)抽象类相当于就是对类得引用性声明,所以它只能定义该类

19、得指针与引用,而不能定义它得对象、在此,A为抽象类,而“Aaa(5)”却定义了A得对象,因此就是错误得。3、分析下列程序中得错误,并说明出错原因。includeclassAAintaa;AA(intxx)aa=xx;public:intget()returnaa;AA()coutv"Destroying"AA<vendl;main()AAelem(5);cout<<elem.get()<<endl;答:(1)AA(intxx)得访问属性错、应具有公有属性解析(1)构造函数虽就是由系统自动调用来生成对象得,但一般都就是在类外调用,所以它得访问属性

20、必须就是公有得。程序中构造函数得访问属性就是私有得(缺省值),运行中必定出错、四。完成程序题(本大题共5小题,每小题4分,共20分)根据题目要求,完成程序填空。1.仔细阅读下列求两个点之间距离得程序,根据程序得输出结果在划线处填入正确语句。classpointfloatx,y;public:point(floata,floatb)x=a;y=b;floatdistance(point&p)floatdx=CD;floatdy=_;return(float)sqrt(dx*dx+dy*dy);voidmain()pointp1(2,3),p2(32,43);coutvp1、«e

21、ndl;答:p、x-x Poy-y distance(p2)解析由于求两点之间距离得函数“distance”为成员函数,所以由该函数得this指针所指对象可用作起点(参数之一),另一个用作终点得参数,必须在函数得参数表中显式地给出。dx与dy分别计算两个结点间x与y坐标间得距离,因此应该为:dx=p、x-x与dy=P。y-y、对它们求平方相加后开方即可,得到两点间得距离:(float)srrt(da*da+dy*dy)。在主程序中求pl与p2两个结点之间得距离,由于由pl调用距离函数,所以由p2作为它得参数,即distance(p2)。 .两个复数只有当它们得实部与虚部分别相等时,才被认为它们

22、相等。在空格处填入合适得内容,以完成下面得程序,使其重载运算符“=”,用以比较两个复数得相等。请在主函数中输出比较得结果、#inc1udeclasscomplexdoub1ereal,ima;public:plex(doubler,doublei)real=r;imag=i;booloperator=(complex&);intplex:operator=(plex&com)return(CD)voidmain()plexc1(12。3,32.5),c2(21.7,18、6);if(_)returncout<<"truen";elsereturn

23、cout<"falsen"答:(real=com、real)&&(imag=com。imag)c1=c2或c1.operator=(c2)解析若两个复数得相等,则必有它们得实数部分与虚数部分都相等,所以运算符重载函数中返回“(real=、real)&&(imag=com>imag)“,只有real=com>real与imag=simag都为真时,该函数得返回值才为真、在主程序中,为了比较两个复数c1与c2,可以隐式地写成"c1=c2”,也可显式写成“c1.operator=(c2)"。3。下列程序中声明了

24、两个类AA与BB,其中函数“print"就是类AA得成员函数,但就是类BB得友元函数。请在、与处各填入正确得内容,使程序能正常运行、#inc1udelassAAintt;public:AA(intx)t=x;voidprint(BB&b);classBBints;public:BB(inty)s=y;friendvoidprint(BB&);voidcout<"AA:"<<Tv";BB:"<W.S<<endl;voidmain()AAm(6);BBn(8);m.print(n);答:class

25、BB; AA: AA:print(BB&w)解析由于AA类得成员函数“print”就是类BB得友元函数,因此它必须有一个BB类得引用作为参数,以便有引用BB类数据成员得接口。但此时BB类还未定义,为解决此矛盾,在处先对BB类作引用性声明"classBB;",告诉系统BB类在后面定义。因为函数“print”就是类AA得成员函数,在类外定义必须加上类名与作用域分辨符,即在处加上“AA:"。在BB类外定义“print”时,因就是友元,所以没有加上“BB:"得必要,但B &w)”、机器运行结果“AA:"还就是必须加得,所以在处填“AA:

26、print(B五、程序分析题1 .请分析以下得程序,给出该程序得正确执行结果。# include<iostreamusingnamespacestd;intadd(intx,inty)returnx+y;voidmain()?intm=2,n=3;coutV"1:"<<add(m+,m+n)<<end1;m=2,n=3;£out<"2:"<add(+m,m+n)<<endl;m=2,n=3;cout<<"3:"<add(m+n,m+)<endl;m

27、=2,n=3;coutv"4:"<add(m+n,+m)<endl;答:1:72:83:84:9解析在说明答案之前,要说明两个问题:1)C+语言中,函数参数就是压在栈里得,因压栈就是从前往后进行得,所以出栈就就是从后向前进行得,也即先取最后得参数,然后再向前逐个取用;2)对于单加运算,m+就是先执行后加1,+m就是加1后再执行。由此,因m=2,n=3;,所以:1:(m+)+(m+n)=2+(2+3)=7(m+后执行,且后加1,所以m=2一直未变)2:(+m)+(m+n)=3+(2+3)=8(+m后执行,但先加1,执行+m时,m=3了)3:(m+n)+(m+)=(

28、3+3)+2=8(先执行m+,后加1,执行m+n时,m=3了)4:(m+n)+(+m)=(3+3)+3=9;(先执行+m,且先加1,故一开始就有m=3)3。请分析下面得程序并给出该程序得执行结果、#includeclassAAinta;public:AA()coutv"InitualizingAA!n”;AA()cout<v"DestroyingAA!n";classBBintb;AAp;pub1ic:BB()cout<<"InitualizingBBn";BB()cout<"DestroyingBB!n&qu

29、ot;voidmain()BBX;cout<"Endingmain!n";答:Initua1izingAA!InitualizingBB!Endingmain!DestroyingBB!DestroyingAA!解析虽然在主程序中只定义了一个类BB得对象,但在类BB中声明了类AA得对象作为它得数据成员。当一个类中含有对象作为数据成员时,在生成对象时,先调用成员对象得构造函数,再调用类自己得构造函数,所以输出了“Initualiz1ngAA!”(成员对象构造函数得输出)与“InitualizingBB!"(类自己构造函数得输出)。对象生成后,执行下一句输出语句

30、,则输出“Endingmain!"、此时程序结束,调用析构函数来析构掉对象,先调用类自身得析构函数,其输出为“DestroyingBB!,再调用成员对象得析构函数,其输出为“DestroyingAA!”。4、写出下列程序得运行结果。# includeclassAApublic:staticintn;AA()n+;intAA:n=0;main()cout<"AA:n="<<AA:n<endl;AAd1;coutvd1、n<<endl;AAd2;cout<v<d2.nendl;AAd3,d4;cout<<&l

31、t;d1.n<<endl;cout<d2.n<<endl;答:AA:n=0d1on=1d2、n=2d1.n=4d2。n=4解析由于数据成员n得访问属性就是公有得,所以在类外可访问它;又它就是静态变量所以具有全局性。在构造函数中,执行得就是n+操作,即每次调用构造函数n就加1、当程序开始时,因未定义对象,所以n得值为初始化时得值,则输出为“AA:n=0"。当定义了对象d1后,由于调用了构造函数,则该对象中n=1,故输出“d1、n=1"、同理,对象d2输出“d2、n=2"。由于接下来生成了两个对象d3与d4,调用两次构造函数,n两次加1,

32、此时n=4,所以下面两条语句得输出为"dKn=4"与"d2。n=4"。5、写出下列程序得输出结果、#includeclassAApublic:AAcout<"ConstructorofAA.n"fun();virtualvoidfun()coutvv"AA:fun()called>n"classBB:pub1icAApublic:BB()cout<v"Constructorofn“;fun();voidfun()cout<"BB:fun()callen"void

33、main()BBd;答:ConstructorofAA.AA:fun()called。ConstructorofBB.BB:fun()called.解析虽然函数fun()说明为虚函数,但当在构造函数中被调用时,呈现得就是静态联编,即基类与派生类都调用各自得函数fun()。所以,当生成对象d时,先调用基类得构造函数,在构造函数中又调用自己得函数"fun()",所以输出为"ConstructorofAA。"与"AA:fun()called."。同理调用派生类得构造函数时,生成得输出为"ConstructorofBB。”与&quo

34、t;BB:fun()called、"、6.请给出下面得程序得输出结果。includetemplateclassTvoidsort(T*a,intn)Tnum;for(inti=0;i<n-1;i+)for(intj=i;j<n1;j+)if(am>aJ+1)num=aj;a:j=aj+1;aj+1=num;for(i=0;in;i+)coutvai<<endl;voidmain()intiver5=12,45,9,23,37;doubledver5=22、3,56。7,43.5,13.8,8、6;sort(iver,5);sort(dver,.5);答:

35、9122337458。613、822、343、556。7解析这就是使用模板得例子。函数s。rt就是一个递增得排序函数,T就是个模板、当数组就是整型数据类型时,它为整型数组排序;当数组为双精度数据类型时,它为双精度数组排序。所以输出如上结果。7.分析以下程序得执行结果#includeiostream。h>voidmain()inta;int&b=a;/变量引用b=10;cout<"a="<aendl;解:本题说明变量引用得方法。b就是a得引用,它们分配相同得空间,1得值即为a得值、所以输出为a=10。8。分析以下程序得执行结果#include<

36、iostream.h>classSampleintx;public:Sample();Sample(inta)x=a;Samp1e(Sample&a)x=a。x+1;voiddisp()cout<"x="<<x<<endl;voidmain()Samples1(2),s2(s1);s2odisp();解:本题说明类拷贝构造函数得使用方法。Sample类得Sample(Sample&a)构造函数就是一个拷贝构造函数,将a对象得x值赋给当前对象得x后加1、所以输出为:x=3。9. 分析以下程序得执行结果#includeiost

37、ream。h>classSamplepublic:intx;inty;voiddisp()cout(v"x="<(x<<",y="<vyv<endl;voidmain()intSample:*pc;Samples,*p=&s;pc=&Sample:x;p->*pc=10;pc=&Sample:y;p>*pc=20;p>disp();解:本题说明了类数据成员指针得使用方法、这里通过指向对象得指针来给类数据成员赋值其原理与上题相似。输出为:x=10,y=2010. 分析以下程序得执

38、行结果#inc1ude<iostream.h>classSampleintx;inty;public:Sample(inta,intb)x=a;y=b;intgetx()returnx;intgety()returny;voidmain()int(Sample:*fp)();fp=&Sample:getx;Samples(2,7);intv=(s.fp)();fp=&SampLe:gety;intt=(s。*fp)();cout"v="<v<<",t="<tendl;解:本题说明了类成员函数指针得使用方

39、法、在ma1n()中定义得fp就是一个指向Sample类成员函数得指针。执行fp=Sample:getx后。fp指向成员函数getx(),intv=(s、*fp)()语句等价于intv、getx(),v=x=2;执行fp=Sample:gety之后,fp指向成员函数gety(),intt=(s.*fp)()语句等价于intt=s、gety(),t=x=7。所以输出为:v=2,t=711. 分析以下程序得执行结果#include<iostream。h>classSampleintx;inty;public:Sample(inta,intb)x=a;y=b;intgetx()retur

40、nx;intgety()returny;voidmain()int(Sample:fp)();fp=&Sample:getx;Samples(2,7),*p=&s;intv=(p->*fp)();fp=&Sample:gety;intt=(p*fp)();cout"v="vV",t="<tvendl;解:本题说明了类成员函数指针得使用方法、这里通过指向对象得指针来调用指向类成员函数得指针,其原理与上题相似。输出仍为:v=2,t=71 2.分析以下程序得执行结果#inc1udeviostream。h>classba

41、sepub1ic:base()coutv<"constructingbaseclass"<endl;base()cout<<"destructingbaseclass”endl;classsubs:pub1icbasepublic:subs()cout<<"construetingsubclass"<endl;subs()cout<<"destructingsubc1ass”end1;voidmain()subss;解:本题说明单继承情况下构造函数与析构函数得调用顺序、这里base

42、为基类,subs为派生类。所以输出为:constructingbaseclassconstructingsubclassdestructingsubclassdestrcutingbaseclass注意:在单继承情况下,首先调用基类得构造函数,随后调用派生类得构造函数,析构函数得调用顺序则正好相反。13。 分析以下程序得执行结果:#inc1ude<iostrearnth>c1assbase1 ntn;public:base(inta)cout<"constructingbasec1ass”<endl;n=a;coutvv"n="n<&

43、lt;end1;base()coutvv“destructingbaseclass"<endl;c1asssubs:publicbasebasebobj;intm;public:subs(inta,intb,intc):base(a),bobj(c)cout<<"constructingsubcass"endl;m=b;cout<"m="mvvendl;subs()cout<<"destructingsubc1ass"<<end1;voidmain()subss(1,2,3);

44、解:本题说明派生类中含有对象成员情况下构造函数与析构函数得调用顺序。这里base为基类,subs为派生类,subs类得构造函数中含有对象成员、所以输出为:constrcutingbaseclassn=1constructingbasec1assn=3constructingsubclassm=2destructingsubc1assdestructingbaseclassdestructingbasec1ass注意:当派生类中含有对象成员时,构造函数得调用顺序如下:基类得构造函数2 )对象成员得构造函数3)派生类得构造函数析构函数得调用顺序与之相反14. 分析以下程序得执行结果#inc1ude

45、<iostream、h>classApublic:intn;classB:publicA;classC:publicA;classD:pub1icB,pub1icCintgetn()returnB:n;voidmain()Dd;d.B:n=10;d。C:n=20;cout<d.B:n<<",d.C:n<<endl;解:D类就是从类与类派生得而类与类又都就是从类派生得,但各有自己得副本。所以对于对象d,d。B:n与d。C:n就是两个不同得数据成员它们互无联系。所以输出为:10,201 5、分析以下程序得执行结果#includeiostream.

46、h>c1assApub1ic:intn;;classB:virtua1publicA;c1assC:virtualpublicA;classD:publicB,publicCintgetn()returnB:n;voidmain()Dd;d、B:n=10;d.C:n=20;cout<d。B:n<<","<<d、C:n<<endl;解:D类就是从类与类派生得而类与类又都就是从类派生,但这就是虚继承关系即就是虚基类因此与共用一个得副本所以对于对象d,d.B:n与d。C:n就是一个成员。所以输出为:20,2016. 分析以下程序执行

47、结果# inc1ude<iostream。h>intadd(intx,inty)returnx+y;doub1eadd(doublex,doubley)returnx+y;voidmain()inta=4,b=6;doublec=2。6,d=7.4;cout<add(a,b)<","<<add(c,d)<endl;解:本题说明函数重载得使用方法,这里有两个add()函数,一个add()函数得参数与返回值为int型,另一个得参数与返回值为double型,它们就是根据参数类型自动区分得。所以输出为:10,1017、分析以下程序得执行结果

48、# include<iostreamrh>classSampleinti;doubled;public:voidsetdata(intn)i=n;voidsetdata(doub1ex)d=x;voiddisp()cout<"i="<i<<",d="d<endl;voidmain()Samples;s、setdata(10);s.setdata(15o6);s.disp();解:本题说明重载成员函数得使用方法。setdata()成员函数有两个,根据其参数类型加以区分。所以输出为:i=10,d=15、622. 分析

49、以下程序得执行结果#includeviostream、h>classSampleintn;public:Sample()Samp1e(inti)n=i;Sample&operator=(Sample);voiddisp()cout<"n="<vnv<endl;Sample&Sample:operator=(Samples)Sample:n=s、n;return*this;voidmain()Samples1(10),s2;s2=s1;52。 disp();解:本题说明重载运算符(=)得使用方法、operator=成员函数实现两个对象得

50、赋值。所以输出为:n=10六。程序设计题1 .设计一个三角形类Triangle,包含三角形三条边长彳#私有数据成员,另有一个重载运算符“+”,以实现求两个三角形对象得面积之与。解:在Triang1e类中设计一个友元函数operator+(Trianglet1,Trianglet2),它重载运算符"+",返回t1与t2两个三角形得面积之与。本题程序如下:#inc1ude<iostream、h>#include<math。h>classTriangleintx,y,z;doub1earea;pub1ic:Triangle(inti,intj,intk)d

51、oubles;X=i;y=j;z=k;s=(x+y+z)/2.0;area=sqrt(s*(s-x)*(s-y)*(s-z);voiddisparea()coutv"Area="area<<endl;frienddoubleoperator+(Triang1et1,Trianglet2)returnt1.area+t2、area;voidmain()Triang1et1(3,4,5),t2(4,5,6);doubles;cout<v"t1:"t1、disparea();cout<"t2:"t2.disparea

52、();s=t1+t2;coutv"总面积="<<sendl;本程序执行结果如下:t1:Area=6t2:Area=9。92157总面积=15、92162、重载运算符“+”友元函数只能返回两个三角形得面积之与,不能计算三个三角形得面积之与,改进一下,使之能计算任意多个三角形得面积之与。解:重载运算符为什么不能计算3个三角形得面积之与呢?对于式子:s=t1+t2+t3,先计算t1+t2,返回一个double数然后再进行该double数+t3得计算,显然没有这样得重载运算符“+”友元函数,只需要添加这样重载运算符“+"友元函数即可。本题程序如下:#inclu

53、deiostream、h>#inc1udemath、h>classTriangleintx,y,z;doublearea;public:Triangle(inti,intj,intk)doubles;x=i;y=j;z=k;s=(x+y+z)/2。0;area=sqrt(s*(sx)*(s-y)*(sz);voiddisparea()cout<<"Area="<<area<end1;frienddoub1eoperator+(Trianglet1,Triang1et2)returnt1。area+t2。area;frienddoub

54、1eoperator+(doub1ed,Trianglet)returnd+1、area;voidmain()Trianglet1(3,4,5),t2(4,5,6),t3(5,6,7),t4(6,7,8);doubles;coutv<"t1:"t1odisparea();cout<<"t2:"t2。disparea();cout<<"t3:"t3.disparea();coutv"t4:"t4。disparea();s=t1+t2+t3+t4;cout<<"总面积="s<end1;本程序得执行结果如下:t1:Area=6t2:Area=9.92157t3:Area=l4。6969t4:Area=20。3332总面积=50.95173.设计一个学生类student,包括姓名与三门课程成绩,利用重载运算符”+“将所有学生得成绩相加放在一个对象中,再对该对象求各门课程得平均分。解:# includeiostream、h># include<iomanip。h># includevstring、h>classstudentcharname10;intde

温馨提示

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

评论

0/150

提交评论