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

下载本文档

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

文档简介

,面向对象程序设计中的数据隐藏指的是参考答案为:DA.输入数据必须输入保密口令B.数据经过加密处理 C.对象内部数据结构上建有防火墙 D.对象内部数据结构的不可访问性[解析]输入数据必须输入保密口令和数据经过加密处理都不是面向对象程序设计的特征;对象内部数据结构上也不可能建有防火墙所以它们都不是面向对象程序设计中所指的数据隐藏。面向对象程序设计系统中的封装单位是对象,对象之间只能通过接口进行信息交流,外部不能对对象中的数据随意地进行访问,这就造成了对象内部数据结构的不可访问性,也使得数据被隐藏在对象中。这就是面向对象程序设计中的数据隐藏所指。.下列各项中符合函数重载必须满足的条件的是参考答案为:DA.必须有不同的参数个数 B.对应的参数类型必须不相同 C.A和B必须同时满足 D.A和B只要满足一个即可[解析]我们知道,在同一个作用域中,要实现函数重载必须满足的条件的是:①有不同的参数个数或者②对应的参数有不相同的数据类型即①和②中只要有一个满足就可以了。当然两者都满足更好,但这不是必须的。.下列带缺省值参数的函数说明中,正确的说明是 参考答案为:AA.intFun(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);[解析]在带缺省值参数的函数说明中,正确的说明应该是无缺省值的参数依次排列在参数表的左边,排完无缺省值的参数后,再依次排列带缺省值的参数。从所给出的四个选项来看,只有“intFun(intx,inty=2,intz=3)”符合这条规定,其它的都不符合。.有如下的对类“CSample”的说明,其中()是错误的。classCSample{ 参考答案为:AA.inta=23;B.CSample();public:C.CSample(intval);D.~CSample();)[解析]在上面对类"CSample"说明中,"CSample()"和"CSample(intval)”是该类重载的构造函数“~CSample()"是该类的析构函数,这三个语句都是正确的。错误的语句是"inta=23",因为它违反了在类的声明(不管是引用性声明,还是定义性声明)中都不能以赋值表达式的形式给它的数据成员进行初始化。.已知类A中的一个成员函数的说明如下:voidSet(A&a);则该函数的参数2&a"的含义是 参考答案为:CA.指向A的指针为aB.将变量a的地址赋给类AC.类A对象引用a用作函数的形参D.变量A与a按位与后作函数参数[解析]因为A是一个类,所以"A&a"表示a是类A的对象,但因为对象a的前缀了符号"&",则"&a"表示是类A的对象引用。所以“A&a"的含义是类A对象引用a用作函数的形参。.若类A和类B的定义如下:classA{public:inti,j;voidget(););classB:A{inti,j;protected:intk;public:voidmake(););voidB::make(){k=i*j;}则其中()是非法的表达式。 参考答案为:DA.voidget();B.intk;C.voidmake();D.k=i*j;[解析]对于给定的四项中,前三项都是正确的,只有第四项是错误的。因为,郑是类A的私有派生类(缺省访问类型),所以A中的公类型的数据成员在类B中成为了私有数据成员,但函数“v。idB::make()”既然是类B的成员函数,则既可访问类A中的公有数据成员,也能访问类B中的私有数据成员,则表达式“k=i*『造成了访问的二义性,即其中的i和j,到底是取自类A呢?还是取自类B呢?.下面的主程序中,语句()是错误的。classA{inti;public:virtualvoidfun()=0;A(inta){i=a;});classB{intj;public:voidfun(){cout<<"B::fun()\n”;}B(intb,intc):A(b){j=c;}};voidmain() 参考答案为:AA.{Aa(5);.A*pa;C.Bb(7);D.B*pb;}[解析]在类A中,函数"virtualvoidfun()=0”为纯虚函数,因此,类A为抽象类。作为抽象类,它是不能被用来定义具体对象的,而语句Aa(5);”恰恰是定义抽象类的对象的,所以它是错误的8.拷贝(复制)构造函数的作用是 参考答案为:CA.进行数据类型的转换.用对象调用成员函数C.用对象初始化对象D.用一般类型的数据初始化对象[解析]进行数据类型的转换和用一般类型的数据初始化对象都是一般构造函数的功能。用对象调用成员函数不用构造函数,只要用"对象名.成员函数名“即可。所以拷贝(复制)构造函数的作用,只能是用对象来初始化对象。.下列说法中,正确的说法是 参考答案为:BA.所有的运算符都能被重载B.运算符被重载时,它们的优先级与结合性不会改变C.当需要时,我们可以自定义一个运算符来进行重载D.每个运算符都可以被重载成成员函数和友元函数[解析]当重载运算符时,不是所有的运算符都能被重载,有几个运算符是不能被重载的,如三元运算符"?:"、’.'、’*'、‘::'、'#'等;也不是每个运算符都可以被重载成成员函数和友元函数,如运算符‘='、‘('‛[]‘、和'T'都只能被重载成成员函数;无论何时,都不能自定义运算符来进行重载,也即重载只能对已有运算符进行;但是运算符被重载时,它们的优先级与结合性不会改变。.下面对结构或类中成员的访问中,不正确的访问是 参考答案为:AA.*pointer.salary;(其中pointer为指向类对象的指针)B.pointer->salary;C.x=worker.salary;(其中worker为具有类类型的对象)D.Location&rA=A1;intx=rA.GetX();(Location为已定义的类,A1为对象)[解析]因pointer为指向类对象的指针,所以“pointer->salary”是正确的访问数据成员的形式;因worker为具有类类型的对象,所以Worker.salary”也是正确的访问数据成员的形式;因Location为已定义的类,A1为对象,所以"Location&rA=A1;intx=rA.GetX();"表示以对象人1初始化对象引用rA然后由对象引用rA调用成员函数GetX()给变量x赋值,这样的访问成员函数的形式也是正确的;"*pointer.salary;"中,因为运算符’.’的优先级高于运算符‘*'的优先级,所以相当于"*(pointer.salary);",那正确的形式应该是"*(pointeLsalary);"。故"*pointer.salary”是不正确的访问。. C++对C语言作了很多改进,即从面向过程变成为面向对象的主要原因是()DA.增加了一些新的运算符B.允许函数重载,并允许设置缺省参数C.规定函数说明符必须用原型D.引进了类和对象的概念. 下列符号不能组成标识符的是(A)A.连接符B.下划线C.大小写字母D.数字字符. 类型修饰符unsigned不能修饰(D)A.charB.intC.longintD.float.在inta=3,int*p=&a;中,*p的值是(D)A.变量a的地址值B.无意义C.变量p的地址值D.3.下列关于指针的操作中,错误的是(D)A.两个同类型的指针可以进行比较运算B.可以用一个空指针赋给某个指针C.一个指针可以加上两个整数之差D.两个同类型的指针可以相加二,填空题 不写解答过程,将正确的答案写在每小题的空格内。错填或不填均无分。.面向对象程序设计中的多态性包括静态多态性和动态多态性,前者由 机制支持,而后者则由 机制支持。答:函数重载、虚函数[解析]静态多态性又称编译时多态性,调用何函数应该在编译之前就知道了,所以必须由函数重载机制来支持。动态多态性又称运行时多态性,调用何函数只有在运行时才知道,所以由虚函数(与指针或引用)机制来支持。.由charconst*str="stucture”;所以定义的指针称为,关键字const所修饰的是 。答:指向常量的指针、指针所指的字符串[解析]根据由'*'在修饰符"const"中位置的不同,它所修饰的对象也不同,"const”表示所修饰的是指针所指的常量,该指针称为指向常量的指针;"*8门$1"表示所修饰的是指针本身,该指针称为常指针;"*const*"则表示所修饰的是指针本身和指针所指常量,该指针称为指向常量的常指针。.弓|入虚基类的目的是为了解决多重继承中的 和 问题。答:二义性、多占用空间[解析]在允许多重继承时可能出现两个问题,第一个是公有派生类中的成员通过不同基类调用它们上一级公共基类的同一成员,这就产生了调用的二义性;每一个基类都为它们的上一级公共基类存有备份,这就引起了公共基类的重复存储,也就多占了存储空间。引入虚基类的目的是为了解决多重继承中的这两个问题。.构造函数与析构函数所调用的虚函数是的函数,因此调用时实现的是 联编。答:所在类、静态[解析]在生成派生类的对象时,先调用基类的构造函数生成基类对象,再调用派生类的构造函数来生成派生类对象。所以当在构造函数中调用虚函数时,当调用基类的构造函数时,此时派生类还未生成,所以它只能调用自己的虚函数;调用派生类构造函数时,它也只能调用自己的虚函数,因为虚函数的调用是不能由派生类调用基类的。在析构派生类对象是时,先调用派生类的析构函数析构掉派生类对象,再调用基类的析构函数来析够掉基类的对象。所以当在析够构函数中调用虚函数时,派生类的析构函数调用的是它自己的虚函数(原因同构造函数),基类的析构函数调用的也是它自己的虚函数,因为此时派生类对象以已被析构掉了。由上可见,当构造函数与析够函数调用虚函数时,它们调用的都是自己类的函数,因此调用时实现的是静态联编。7.说明一个const成员函数(又称常量成员函数)的方法是,将const写在 之间,而且它修饰的是 。答:函数头与函数体、this指针[解析]为了说明一个常量成员函数的方法是,将const写在函数头的右圆括号‘)与函数体的左花括号'{'之间,而且它修饰的是对象所属的this指针。表示该函数不能修改它所在对象中的数据成员的值。20.对某个运算符的重载,实际上是用关键字 与该运算符组成一个运算符函数,而且该运算符函数的返回类型不能是 的。答:operater、void[解析]对某个运算符的重载实际上是用关键字。perater与该运算符组成一个运算符函数,而且该运算符函数的返回类型不能是无类型的,即不能是void的。三改错题.分析下列程序中的错误,并说明出错原因。#includeclassbase{constintn;public:base(){cout<<"Initializingdefault\n”;}base(intm){cout<<"Initializing\n”;n=m;}~base(){cout<<"Destroying\n”;}};voidmain(){basex(1);basey=x;}答:(1)n=m;const数据成员不以该形式赋值(2)错误处basey=x;,以对象初始化对象[解析](1)作为const数据成员n不能用赋值表达式的形式为其赋初值,必须在定义构造函数时在函数头中以“base(intm):n(m)”形式来初始化。(2)basey=x;语句中‘二’不是赋值的意思,而是初始化的意思。即在定义类base的对象y时,以对象x给它初始化,相当于basey(x);。但是以对象初始化对象时,必须调用拷贝构造函数才行。因程序中没给出拷贝构造函数,也不能调用系统的缺省拷贝构造函数,因用户给出了构造函数后,再也不能调用系统提供的任何缺省构造函数。所以,basey=x;是错误的。.分析下列程序中的错误,并说明出错原因。#includeclassA{intx;public:A(inta){x=a;fun();}virtualvoidfun()=0;};classB:publicA{public:B(intb):A(b){}voidfun(){}};voidmain(){Aaa(5);Bbb(8);}答:1)Aaa(5);抽象类不能定义对象[解析](1)在构造函数"做讨a)”调用了纯虚函数"何鼠)",因构造函数调用虚函数是静态联编,即调用的是它自己类的虚函数在此调用的是纯虚函数,它只被说明,而未定义,所以不可能被执行,因此出错。(2)抽象类相当于是对类的引用性声明,所以它只能定义该类的指针和引用,而不能定义它的对象。在此,A为抽象类,而“Aaa(5)”却定义了A的对象,因此是错误的。.分析下列程序中的错误,并说明出错原因。#includeclassAA{intaa;AA(intxx){aa=xx;}public:intget(){returnaa;}~AA(){cout<<"Destroying"<<AA<<endl;};main(){AAelem(5);cout<<elem.get()<<endl;}答:(l)AA(intxx)的访问属性错、应具有公有属性[解析](1)构造函数虽是由系统自动调用来生成对象的,但一般都是在类外调用,所以它的访问属性必须是公有的。程序中构造函数的访问属性是私有的(缺省值),运行中必定出错。四.完成程序题(本大题共5小题,每小题4分,共20分)根据题目要求,完成程序填空。.仔细阅读下列求两个点之间距离的程序,根据程序的输出结果在划线处填入正确语句。classpoint{floatx,y;public:point(floata,floatb){x=a;y=b;}floatdistance(point&p){floatdx=①;floatdy=②;return(float)sqrt(dx*dx+dy*dy);));voidmain(){pointp1(2,3),p2(32,43);cout<<p1.—③—<<endl;)答:①p.x-x②p.y-y③distance(p2)[解析]由于求两点之间距离的函数"distance"为成员函数,所以由该函数的由1$指针所指对象可用作起点(参数之一),另一个用作终点的参数,必须在函数的参数表中显式地给出。dx和dy分别计算两个结点间x和y坐标间的距离,因此应该为:dx=p.x-x和dy=p.y-y。对它们求平方相加后开方即可,得到两点间的距离:(float)srrt(da*da+dy*dy)。在主程序中求pl和p2两个结点之间的距离,由于由pl调用距离函数,所以由p2作为它的参数,即distance(p2)。.两个复数只有当它们的实部和虚部分别相等时,才被认为它们相等。在空格处填入合适的内容,以完成下面的程序,使其重载运算符==",用以比较两个复数的相等。请在主函数中输出比较的结果。#includeclasscomplex{doublereal,imag;public:complex(doubler,doublei){real=r;imag=i;}booloperator==(complex&);};intcomplex::operator==(complex&com){return(®)}voidmain(){complexc1(12.3,32.5),c2(21.7,18.6);if(②)returncout<<"true\n”;elsereturncout<<"false\n”;}答:①(real==com.real)&&(imag==com.imag)②c1二二c2或c1.operator==(c2)[解析]若两个复数的相等,则必有它们的实数部分和虚数部分都相等,所以运算符重载函数中返回”(real二二com.real)&&(imag二二com.imag)”,只有real二二com.real与imag==com.imag都为真时,该函数的返回值才为真。在主程序中,为了比较两个复数c1和c2,可以隐式地写成“c1二二c2”,也可显式写成"c1.operator==(c2)”。3.下列程序中声明了两个类AA和BB,其中函数①的甘’是类AA的成员函数,但是类BB的友元函数。请在①、②和③处各填入正确的内容,使程序能正常运行。#include;classAA{intt;public:AA(intx){t=x;}voidprint(BB&b);};classBB{ints;public:BB(inty){s=y;}friendvoid―②―print(BB&);};void③{cout<<"AA”<<T<<";BB:"<<W.S<<endl;}voidmain(){AAm(6);BBn(8);m.print(n);

)答:①classBB;AA::AA::print(BB&w)[解析]由于AA类的成员函数十。讨”是类BB的友元函数,因此它必须有一个BB类的引用作为参数,以便有引用BB类数据成员的接口。但此时BB类还未定义,为解决此矛盾,在①处先对BB类作引用性声明"classBB;",告诉系统BB类在后面定义。因为函数"print"是类AA的成员函数,在类外定义必须加上类名和作用域分辨符,即在②处加上"AA::"。在BB类外定义"print"时,因是友元,所以没有加上"BB::"的必要,但"AA::"还是必须加的,所以在③处填"AA::print(BB&w)”。五.程序^析题.请分析以下的程序,给出该程序的正确执行结果。#include<iostream>usingnamespacestd;机器运行结果与编译器有关intadd(intx,inty)机器运行结果与编译器有关(returnx+y;}voidmain()(intm=2,n=3;cout<<"1:“<<add(m++,m+n)<<endl;m=2,n=3;cout<<"2:"<<add(++m,m+n)<<endl;m=2,n=3;cout<<"3:"<<add(m+n,m++)<<endl;m=2,n=3;cout<<"4:"<<add(m+n,++m)<<endl;)答:1:7:8:8:9[解析]在说明答案之前,要说明两个问题:1)C++语言中,函数参数是压在栈里的,因压栈是从前往后进行的,所以出栈就是从后向前进行的,也即先取最后的参数,然后再向前逐个取用;2)对于单加运算,m++是先执行后加1,++m是加1后再执行。由此,因m=2,n=3;,所以::(m++)+(m+n)=2+(2+3)=7(m++后执行,且后加1,所以m=2一直未变):(++m)+(m+n)=3+(2+3)=8(++m后执行,但先加1,执行++m时,m=3了):(m+n)+(m++)=(3+3)+2=8(先执行m++,后加1,执行m+n时,m=3了):(m+n)+(++m)=(3+3)+3=9;(先执行++m,且先加1,故一开始就有m=3).请分析下面的程序并给出该程序的执行结果。#includeclassAA{inta;public:AA(){cout<<"InitualizingAA!\n”;}~AA(){cout<<"DestroyingAA!\n”;};classBB{intb;AAp;public:BB(){cout<<"InitualizingBB!\n”;}~BB(){cout<<"DestroyingBB!\n”;};voidmain(){BBX;cout<<"Endingmain!\n”;}答:InitualizingAA!InitualizingBB!Endingmain!DestroyingBB!DestroyingAA![解析]虽然在主程序中只定义了一个类BB的对象,但在类BB中声明了类AA的对象作为它的数据成员。当一个类中含有对象作为数据成员时,在生成对象时,先调用成员对象的构造函数,再调用类自己的构造函数,所以输出了^InitualizingAA!”(成员对象构造函数的输出)和“InitualizingBB!”(类自己构造函数的输出)。对象生成后,执行下一句输出语句,则输出“Endingmain!”。此时程序结束,调用析构函数来析构掉对象,先调用类自身的析构函数,其输出为“DestroyingBB!”,再调用成员对象的析构函数,其输出为“DestroyingAA!”。.写出下列程序的运行结果。#includeclassAA{public:staticintn;AA(){n++;});intAA::n=0;main(){cout<<"AA::n="<<AA::n<<endl;AAd1;cout<<<d1,n<<endl;AAd2;cout<<<d2,n<<endl;AAd3,d4;cout<<<d1,n<<endl;cout<<<d2,n<<endl;)答:AA::n=0d1.n=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,此时n=4,所以下面两条语句的输出为"d1.n=4"和"d2.n=4"。.写出下列程序的输出结果。#includeclassAA{public:AA{}{cout<<"ConstructorofAA.\n";fun();}virtualvoidfun(){cout<<"AA::fun()called.\n”;}};classBB:publicAA{public:BB(){cout<<"ConstructorofBB.\n";fun();}voidfun(){cout<<"BB::fun()called.\n”;}};voidmain(){BBd;}答:ConstructorofAA.AA::fun()called.ConstructorofBB.BB::fun()called.[解析]虽然函数fun()说明为虚函数,但当在构造函数中被调用时,呈现的是静态联编,即基类和派生类都调用各自的函数何鼠)。所以,当生成对象d时,先调用基类的构造函数,在构造函数中又调用自己的函数"fun()",所以输出为“ConstructorofAA”和"AA::fun()called."。同理调用派生类的构造函数时,生成的输出为“ConstructorofBB.”和"BB::fun()called.”。.请给出下面的程序的输出结果。#includetemplateclassTvoidsort(T*a,intn){Tnum;for(inti=0;i<n-1;i++){for(intj=i;j<n-1;j++)if(a[j]>a[j+1]){num=a[j];a[j]=a[j+1];a[j+1]=num;})for(i=0;i<n;i++)cout<<a[i]<<endl;}voidmain(){intiver[5]={12,45,9,23,37};doubledver[5]={22.3,56.7,43.5,13.8,8.6};sort(iver,5);sort(dver,.5);}答:9122337458.613.822.343.556.7[解析]这是使用模板的例子。函数$。七是一个递增的排序函数/是个模板。当数组是整型数据类型时,它为整型数组排序;当数组为双精度数据类型时,它为双精度数组排序。所以输出如上结果。.分析以下程序的执行结果#include<iostream.h>voidmain()(inta;int&b=a;//变量引用b=10;cout<<"a="<<a<<endl;)解:本题说明变量引用的方法。b是a的引用,它们分配相同的空间,b的值即为a的值。所以输出为a=10。.分析以下程序的执行结果#include<iostream.h>classSample(intx;public:Sample(){};Sample(inta){x=a;}Sample(Sample&a){x=a.x+1;}voiddisp(){cout<<"x="<<x<<endl;}};voidmain(){Samples1(2),s2(s1);s2.disp();)解:本题说明类拷贝构造函数的使用方法。Sample类的Sample(Sample&a)构造函数是一个拷贝构造函数,将a对象的x值赋给当前对象的x后加1。所以输出为:x=3。.分析以下程序的执行结果#include<iostream.h>classSample(public:intx;inty;voiddisp()(cout<<"x="<<x<<",y="<<y<<endl;));voidmain()(intSample::*pc;Samples,*p=&s;pc=&Sample::x;p->*pc=10;pc=&Sample::y;p->*pc=20;p->disp();)解:本题说明了类数据成员指针的使用方法。这里通过指向对象的指针来给类数据成员赋值,其原理与上题相似。输出为:x=10,y=20.分析以下程序的执行结果#include<iostream.h>classSample(intx;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="<<t<<endl;)解:本题说明了类成员函数指针的使用方法。在main()中定义的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=7.分析以下程序的执行结果#include<iostream.h>classSample(intx;inty;public:Sample(inta,intb)(x=a;y=b;)intgetx(){returnx;}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="<<v<<",t="<<t<<endl;}解:本题说明了类成员函数指针的使用方法。这里通过指向对象的指针来调用指向类成员函数的指针,其原理与上题相似。输出仍为:v=2,t=7.分析以下程序的执行结果#include<iostream.h>classbase(public:base(){cout<<"constructingbaseclass"<<endl;}~base(){cout<<"destructingbaseclass"<<endl;}};classsubs:publicbase{public:subs(){cout<<"constructingsubclass"<<endl;}~subs(){cout<<"destructingsubclass"<<endl;}};voidmain(){subss;}解:本题说明单继承情况下构造函数和析构函数的调用顺序。这里base为基类,subs为派生类。所以输出为:constructingbaseclassconstructingsubclassdestructingsubclassdestrcutingbaseclass注意:在单继承情况下,首先调用基类的构造函数,随后调用派生类的构造函数,析构函数的调用顺序则正好相反。.分析以下程序的执行结果:#include<iostream.h>classbase(intn;public:base(inta)(cout<<"constructingbaseclass"<<endl;n=a;cout<<"n="<<n<<endl;)〜base(){cout<<"destructingbaseclass"<<endl;});classsubs:publicbase{basebobj;intm;public:subs(inta,intb,intc):base(a),bobj(c)(cout<<"constructingsubcass"<<endl;m=b;cout<<"m="<<m<<endl;)~subs(){cout<<"destructingsubclass"<<endl;});voidmain(){subss(1,2,3);}这里base解:本题说明派生类中含有对象成员情况下构造函数和析构函数的调用顺序。这里base为基类,subs为派生类,subs类的构造函数中含有对象成员。所以输出为:constrcutingbaseclassn=1constructingbaseclassn=3constructingsubclassm=2destructingsubclassdestructingbaseclassdestructingbaseclass注意:当派生类中含有对象成员时,构造函数的调用顺序如下:基类的构造函数2)对象成员的构造函数3)派生类的构造函数析构函数的调用顺序与之相反.分析以下程序的执行结果#include<iostream.h>classA(public:intn;);classB:publicA{};classC:publicA{};classD:publicB,publicC{intgetn(){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,20.分析以下程序的执行结果#include<iostream.h>classA(public:intn;);classB:virtualpublicA{};classC:virtualpublicA{};classD:publicB,publicC{intgetn(){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,20.分析以下程序执行结果#include<iostream.h>intadd(intx,inty)(returnx+y;)doubleadd(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,10.分析以下程序的执行结果#include<iostream.h>classSample(inti;doubled;public:voidsetdata(intn){i=n;}voidsetdata(doublex){d=x;}voiddisp(){cout<<"i="<<i<<",d="<<d<<endl;});voidmain()(Samples;s.setdata(10);s.setdata(15.6);s.disp();)解:本题说明重载成员函数的使用方法。setdata()成员函数有两个,根据其参数类型加以区分。所以输出为:i=10,d=15.622.分析以下程序的执行结果#include<iostream.h>classSample(intn;public:Sample(){}Sample(inti){n=i;}Sample&operator=(Sample);voiddisp(){cout<<"n="<<n<<endl;}};Sample&Sample::operator=(Samples)(Sample::n=s.n;return*this;)voidmain()(Samples1(10),s2;s2=s1;s2.disp();)解:本题说明重载运算符(二)的使用方法。operator二成员函数实现两个对象的赋值。所以输出为:n=10六.程序设计题.设计一个三角形类Triangle,包含三角形三条边长的私有数据成员,另有一个重载运算符"+",以实现求两个三角形对象的面积之和。解:在Triangle类中设计一个友元函数operator+(Trianglet1,Trianglet2),它重载运算符"+",返回t1和t2两个三角形的面积之和。本题程序如下:#include<iostream.h>#include<math.h>classTriangle(intx,y,z;doublearea;public:Triangle(inti,intj,intk)(doubles;x=i;y=j;z=k;s=(x+y+z)/2.0;area=sqrt(s*(s-x)*(s-y)*(s-z));)voiddisparea()(cout<<"Area="<<area<<endl;)frienddoubleoperator+(Trianglet1,Trianglet2)(returnt1.area+t2.area;));voidmain()(Trianglet1(3,4,5),t2(4,5,6);doubles;cout<<"t1:";t1.disparea();cout<<"t2:";t2.disparea();s=t1+t2;cout<<"总面积="<<s<<endl;)本程序执行结果如下:t1:Area=6t2:Area=9.92157总面积=15.9216.重载运算符"+"友元函数只能返回两个三角形的面积之和,不能计算三个三角形的面积之和,改进一下,使之能计算任意多个三角形的面积之和。解:重载运算符为什么不能计算3个三角形的面积之和呢?对于式子:s=t1+t2+t3,先计算t1+t2,返回一个d。uble数然后再进行该d。uble数+t3的计算,显然没有这样的重载运算符"+”友元函数,只需要添加这样重载运算符"+”友元函数即可。本题程序如下:#include<iostream.h>#include<math.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*(s-x)*(s-y)*(s-z));)voiddisparea(){cout<<"Area="<<area<<endl;)frienddoubleoperator+(Trianglet1,Trianglet2){returnt1.area+t2.area;)frienddoubleoperator+(doubled,Trianglet){returnd+t.area;));voidmain()(Trianglet1(3,4,5),t2(4,5,6),t3(5,6,7),t4(6,7,8);doubles;cout<<"t1:";t1.disparea();cout<<"t2:";t2.disparea();cout<<"t3:";t3.disparea();cout<<"t4:";t4.disparea();s=t1+t2+t3+t4;cout<<"总面积="<<s<<endl;}本程序的执行结果如下:t1:Area=6t2:Area=9.92157t3:Area=14.6969t4:Area=20.3332总面积=50.9517.设计一个学生类student,包括姓名和三门课程成绩,利用重载运算符〃+"将所有学生的成绩相加放在一个对象中,再对该对象求各门课程的平均分。解:#include<iostream.h>#include<iomanip.h>#include<string.h>

温馨提示

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

评论

0/150

提交评论