大学c习题答案习题13答案.docx
- 文档编号:6557746
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:21
- 大小:19.99KB
大学c习题答案习题13答案.docx
《大学c习题答案习题13答案.docx》由会员分享,可在线阅读,更多相关《大学c习题答案习题13答案.docx(21页珍藏版)》请在冰豆网上搜索。
大学c习题答案习题13答案
习题13答案
一、简答题
1.什么是运算符重载?
实现运算符重载有几种方法?
如何实现?
答案:
C++提供的运算符重载机制能够实现将已有运算符应用到新的数据类型变量上,赋予运算符新的含义。
C++对运算符重载有一些限制,见13.2.1节。
有两种方法可以实现运算符重载,它们是:
类的成员函数方式和有友元函数方式。
定义友元的目的是在友元函数中直接访问类的私有成员。
实际上,可以通过类的公有函数接口访问类的私有成员,所以实现运算符重载,可以使用非成员、非友元实现运算符的重载。
但是这种实现方法增加了访问私有数据成员的公有函数的调用时间,不值得提倡。
见13.2.2节。
2.如何实现本类对象与其它类对象之间的相互类型转换?
答案:
可以使用“类型转换函数”将本类对象转换成其他类对象。
而“类型转换函数”本质上就是运算符的重载。
另外,可以使用“构造函数”将其他类对象转换成本类对象。
3.什么是虚函数?
什么是纯虚函数?
它们的作用是什么?
答案:
多态性是面向对象程序设计的重要特性,它与前面讲的封装性和继承性构成面向对象程序设计的三大特性。
这三大特性是互相关联的,封装性是基础,继承性是关键,而多态性是补充。
多态分为静态多态和动态多态。
函数重载和运算符重载属于静态多态。
动态多态是运行时的多态,如某些函数的调用关系在运行阶段才能确定。
为了实现函数调用关系的动态多态,可以将函数定义成虚函数。
将一个成员函数定义成虚函数的方法是,在函数定义的返回值类型前加virtual。
在抽象类中,有时无法实现某一功能(即无法决定某一函数的具体实现),只能将函数定义成纯虚函数。
虚函数具有函数实现的函数体,而纯虚函数没有函数体,即没有函数实现。
对纯虚函数,只能在其派生类中实现该函数的功能。
4.试比较虚函数与虚基类的概念及作用。
答案:
虚函数用于实现动态多态。
而虚基类用于实现在多重继承情况下,基类数据成员在派生类中保留一个副本,见12.6节。
二、选择题
答案:
1.C2.D3.A4.D5.B6.C7.D8.C
三、运行结果、完善程序
1.
运行结果:
n=4
n=3
2,3
2.
答案:
先看虚线框中的程序,运行结果为:
D:
:
show()called.8
若将A行的virtual去掉,则结果为:
B:
:
show()called.5
对本题,若将虚线框中的fun()和main()函数同时修改成右侧实线框中的对应函数,则若A行有virtural时,结果为:
D:
:
show()called.8;
若A行无virtual时,结果为:
B:
:
show()called.5。
3.
运行结果为:
TheBversionB
TheD1info:
4version1
TheD2info:
100versionB
TheD3info:
-25version3
去掉A行的virtual,则运行结果为:
TheBversionB
TheBversion1
TheBversionB
TheBversion3
4.
答案:
(1)operatorchar*()
(2)returns;
(3)str=num;
四、编程题
1.
答案:
//实现1,赋值运算符重(=和+=)载函数的返回值为对象的引用。
//缺点:
不可实现对象的连续赋值,只能c1=c2
#include
classComplex
{
floatReal,Image;
public:
Complex(floatr=0,floati=0)
{
Real=r;Image=i;
}
voidshow()
{
cout<<"("< } voidoperator=(Complex&);//用成员实现,注意: =不能用友元实现 voidoperator+=(Complex&);//用成员实现,+=可以用友元实现 friendComplexoperator+(Complex&,Complex&);//用友元实现 friendComplexoperator-(Complex&,Complex&);//用友元实现 }; voidComplex: : operator=(Complex&c)//返回值void { Real=c.Real; Image=c.Image; } voidComplex: : operator+=(Complex&c)//返回值void { Real=Real+c.Real; Image=Image+c.Image; } Complexoperator+(Complex&c1,Complex&c2) { Complext; t.Real=c2.Real+c1.Real; t.Image=c2.Image+c1.Image; returnt; } Complexoperator-(Complex&c1,Complex&c2) { Complext; t.Real=c1.Real-c2.Real; t.Image=c1.Image-c2.Image; returnt; } voidmain() { Complexc1(1,2),c2(3,4),c3; c3=c1;c3.show(); c3=c1+c2;c3.show(); c3+=c2;c3.show(); c3=c1-c2;c3.show(); } //实现2,赋值运算符重(=和+=)载函数的返回值为对象的引用。 //优点: 可实现对象的连续赋值,如c1=c2=c3 #include classComplex { floatReal,Image; public: Complex(floatr=0,floati=0) { Real=r;Image=i; } voidshow() { cout<<"("< } Complex&operator=(Complex&);//用成员实现,注意: =不能用友元实现 Complex&operator+=(Complex&);//用成员实现,+=可以用友元实现 friendComplexoperator+(Complex&,Complex&);//用友元实现 friendComplexoperator-(Complex&,Complex&);//用友元实现 }; Complex&Complex: : operator=(Complex&c)//返回值为对象的引用 { Real=c.Real; Image=c.Image; return*this; } Complex&Complex: : operator+=(Complex&c)//返回值为对象的引用 { Real=Real+c.Real; Image=Image+c.Image; return*this; } Complexoperator+(Complex&c1,Complex&c2) { Complext; t.Real=c2.Real+c1.Real; t.Image=c2.Image+c1.Image; returnt; } Complexoperator-(Complex&c1,Complex&c2) { Complext; t.Real=c1.Real-c2.Real; t.Image=c1.Image-c2.Image; returnt; } voidmain() { Complexc1(1,2),c2(3,4),c3; c3=c2=c1;c3.show(); c3=c1+c2;c3.show(); c3+=c2;c3.show(); c3=c1-c2;c3.show(); } 2. 答案: #include #include classFraction { intm,n;//m是分子,n是分母 public: Fraction(intim=0,intin=1) { intt=gcd(im,in); m=im/t;n=in/t; if(m*n>0)//若分子和分母同号 {m=abs(m);n=abs(n);} else//若分子和分母异号 {m=-abs(m);n=abs(n);}; } intgcd(intx,inty); Fraction&operator=(Fractionb) { m=b.m;n=b.n; return*this; } Fractionoperator+(Fractionb) {returnFraction(m*b.n+n*b.m,n*b.n);} Fractionoperator-(Fractionb) {returnFraction(m*b.n-n*b.m,n*b.n);} friendFractionoperator*(Fractiona,Fractionb); friendFractionoperator/(Fractiona,Fractionb); voidShow() {cout< }; intFraction: : gcd(intx,inty)//返回的最大公约数是正数 { intr; if(x<0)x=-x; if(y<0)y=-y; while(r=x%y) {x=y;y=r;} returny; } Fractionoperator*(Fractiona,Fractionb) {returnFraction(a.m*b.m,a.n*b.n);} Fractionoperator/(Fractiona,Fractionb) {returnFraction(a.m*b.n,a.n*b.m);} voidmain() { Fractiona(1,3),b(3,-12),c; cout<<"a=";a.Show(); cout<<"b=";b.Show(); c=a+b; cout<<"a+b=";c.Show(); c=a-b; cout<<"a-b=";c.Show(); c=a*b; cout<<"a*b=";c.Show(); c=a/b; cout<<"a/b=";c.Show(); } 3. 答案: #include classPoint { floatx,y; public: Point(floata=0,floatb=0) {x=a;y=b;} voidshow() {cout<<"x="< Point&operator++();//用成员函数实现前置,返回引用 Pointoperator++(int);//用成员函数实现后置,返回对象 friendPoint&operator--(Point&);//用友元函数实现前置,返回引用 friendPointoperator--(Point&,int);//用友元函数实现后置,返回对象 //前置或后置,一般应返回对象或引用,否则只能单独使用 //既a++合法,而b=a++;非法 }; Point&Point: : operator++()//前置,成员实现 { x++;y++; return*this; } PointPoint: : operator++(int)//后置,成员实现 { Pointt=*this; x++;y++; returnt; } Point&operator--(Point&p)//前置,友元实现 { p.x--;p.y--; returnp; } Pointoperator--(Point&p,int)//后置,友元实现 { Pointtemp=p; p.x--;p.y--; returntemp; } voidmain() { Pointm(1,2),c; c=m++;//如果只写m++;m.show();则无法测出是前置还是后置 c.show(); m.show(); c=++m; c.show(); m.show(); c=m--; c.show(); m.show(); c=--m; c.show(); m.show(); } 4. 答案: #include #include classstring { char*str; intlen; public: string(char*s=0)//构造函数,含缺省构造函数 { if(s)//此处必须判断s是否为空指针。 { len=strlen(s);//若s为空指针,则strlen(s)报运行错。 str=newchar[len+1]; strcpy(str,s); } else len=0,str=0;//注意逗号 } string(string&st)//拷贝构造函数,必须要定义,想一想为什么? { if(st.str) { len=st.len; str=newchar[len+1]; strcpy(str,st.str); } else len=0,str=0; } ~string()//析构函数 { if(str) delete[]str; } voidset(char*s)//置值 { if(str) delete[]str;//必须先删除原空间 if(s) { len=strlen(s); str=newchar[strlen(s)+1]; strcpy(str,s); } else str=0,len=0; } voidshow(void)//显示串 { if(str) cout< else cout<<"Thestringisempty! "< } intgetlen(void)//获取长度 { returnlen; } //解1 voiddelchar(charch)//删除字符(删除所有参数指定的字符) { inti,j; for(i=j=0;str[i];i++) if(str[i]! =ch)str[j++]=str[i]; str[j]='\0'; char*t=str;//使字符串长度与成员len的值保持一致 str=newchar[strlen(t)+1]; strcpy(str,t); len=strlen(str); delete[]t; } /*解2 voiddelchar(charch)//删除字符(删除所有参数指定的字符) { inti=0; if(str) //while(i while(str[i])//删除若干字符后,len与str指向的空间长度不一致 if(str[i]==ch)//可处理成一致,亦可忽略这种不一致 { strcpy(str+i,str+i+1); len--;//注意 } elsei++; } */ /*解3 voiddelchar(charch) { inti=0,j=0; if(str) for(;i { if(str[i]==ch) { j=i; for(;j str[j]=str[j+1]; len--; i--; } } } */ string&operator=(string&s)//赋值运算只能用成员实现 { if(str) delete[]str; len=s.len; if(s.str) { str=newchar[len+1]; strcpy(str,s.str); } else str=0; return*this; } string&operator+=(string&s)//字符串拼接+= { stringt=*this;//调用拷贝构造函数,初始化t(保存老串) if(str) delete[]str;//删除老串 len=len+s.len; if(len) { str=newchar[len+1]; strcpy(str,t.str); strcat(str,s.str); } return*this; } friendstringoperator+(string&s1,string&s2);//字符串拼接+,类外实现 intoperator==(string&s)//字符串比较 { if(strcmp(str,s.str)==0) return1; else return0; //或return(! strcmp(str,s.str)); } }; stringoperator+(string&s1,string&s2)//字符串拼接+,类外实现 { stringt; t.len=s1.len+s2.len; if(t.len) { t.str=newchar[t.len+1]; strcpy(t.str,s1.str); strcat(t.str,s2.str); } else t.str=0; returnt;//因为返回对象(动态申请空间),所以要定义拷贝构造函数 } voidmain() { char*a="Cplusplus"; strings1(a),s2("language"),s3;//测试两种构造函数 s1.show(); s2.show(); s3.show(); cout<<"Beforassign: \n"; if(s1==s2)//测试比较运算符== cout<<"s1ands2issame! "< if(! (s1==s2)) cout<<"s1ands2isdifferent! "< s1=s2;//测试赋值运算符= cout<<"Afterassigns1=s2: \n"; if(s1==s2) cout<<"s1ands2issame! "< if(! (s1==s2)) cout<<"s1ands2isdifferent! "< s3=s1+s2;//测试加法及赋值运算符+=,= s3.show(); s3+=s2;//测试运算符+= s3.show(); s3.delchar('e');//想一想,能否处理成s3-'e'//测试删除字符串函数 s3.show(); s3.delchar('a'); s3.show(); s3.delchar('g'); s3.show(); } 5. 答案: #include classMatrix { int*p,m,n; public: Matrix(intmm,intnn) { m=mm,n=nn; p=newint[m*n]; } Matrix(Matrix&b) { m=b.m;n=b.n; p=newint[m*n]; for(inti=0;i p[i]=(b.p)[i]; } voidinput() { inti; for(i=0;i cin>>p[i]; } Matrixoperator+(Matrix&b)//? ? ? { if(m! =b.m||n! =b.n) { cout<<"Thetwomatrixarenotsamesize! \n"; return*this; } for(inti=0;i p[i]+=(b.p)[i]; return*this; } voidoperator=(Matrix&b) { if(m! =b.m||n! =b.n) { cout<<"Thetwomatrixarenotsamesize! \n"; } for(inti=0;i p[i]=(b.p)[i]; } voidshow() { inti,j; int*p1=p; for(i=0;i { for(j=0;j cout<<(*p1++)<<'\t'; cout<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 大学 习题 答案 13