您好,欢迎访问三七文档
第九章友元函数与运算符重载9.3习题一.选择题1.C2.C3.D4.D5.A6.A7.C8.C9.A10.D11.C12.C13.D14.A15.A16.D17.A18.D19.C20.C二.填空题1.A2.封装性3.友元函数4.(1)当前对象(2)该函数的参数5.友元6.x.operator+(operator*(y,z))7.静态8.重载赋值运算符9.A&operator=(A&);10.1020102011.1212.点(1,2)点(2,3)点(3,4)点(2,3)13.10201020112114.6,84,515.(1)Tpoint::a(2)b(3)(a.a-b.a)*(a.a-b.a)+(a.b-b.b)*(a.b-b.b)16.(1)Fraction(){}(2)f.num=-num(3)returnf17.(1)Array(){}(2)ArrayArray::operator^(Arrayarr)(3)jarr.ar[i](4)*this18.(1)t.geta()(2)*this19.(1)strlen(s)+1(2)ptr-=2(3)delete[]str20.(1)intindex(2)data[index](3)a[i]三.程序设计题1.定义一个圆锥体类,分别用成员函数和友元函数求出圆锥体的体积。#includeiostream.h#includemath.hconstfloatPI=3.1415926;classV{floatr,h;public:V(floata,floatb){r=a;h=b;}floatv1(){returnPI*pow(r,2)*h/3;}friendfloatvolum(V&);};floatvolum(V&a){returnPI*a.r*a.r*a.h/3;}voidmain(){Va1(25,40);cout圆锥体的体积为:\n;coutvolum(a1)endl;couta1.v1()endl;}2.定义一个矩阵类Array,通过成员函数重载赋值运算符“=”和加法运算符“+”,友元函数重载减法运算符“-”,实现矩阵的相加、减。#includeiostream.hclassArray{inta[3][4];public:Array(){for(inti=0;i3;i++)for(intj=0;j4;j++)a[i][j]=0;}Array(intt[][4],intn){for(inti=0;in;i++)for(intj=0;j4;j++)a[i][j]=t[i][j];}Array&operator=(Array&t){for(inti=0;i3;i++)for(intj=0;j4;j++)a[i][j]=t.a[i][j];return*this;}Arrayoperator+(Arrayt){Arraytemp;for(inti=0;i3;i++)for(intj=0;j4;j++)temp.a[i][j]=a[i][j]+t.a[i][j];returntemp;}friendArrayoperator-(Arrayt1,Arrayt2){Arrayt;for(inti=0;i3;i++)for(intj=0;j4;j++)t.a[i][j]=t1.a[i][j]-t2.a[i][j];returnt;}voidprint(){for(inti=0;i3;i++){for(intj=0;j4;j++)couta[i][j]'\t';cout'\n';}}};voidmain(){inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};intb[3][4]={11,12,13,14,15,16,17,18,19,20,21,22};Arraya1(a,3),a2(b,3),test;test=a1+a2;couta1+a2=\n;test.print();test=a1-a2;couta1-a2=\n;test.print();}3.定义一个关于函数f(x,y)=ax2+by+c的类Fun,重载函数调用运算符“()”求函数的值。#includeiostream.hclassFun{floata,b,c;public:Fun(floati=0,floatj=0,floatk=0){a=i;b=j;c=k;}floatoperator()(floatx,floaty){returna*x*x+b*y+c;}voidprint(){coutf(x,y)=ax*x+by+c'\n';}};voidmain(){Funf(2,4,6);f.print();coutf(2,3)=f(2,3)endl;}4.定义了一个集合类Set,Set类中重载了“&&”运算符,用于求两个集合的交集。#includeiostream.hclassSet{int*p;intlen;public:Set(int*t,intn);friendint*operator&&(Set&s1,Set&s2);voidprint();~Set();};Set::Set(int*t,intn){len=n;p=newint[len];for(inti=0;ilen;i++)p[i]=t[i];}int*operator&&(Set&s1,Set&s2){for(inti=0,k=0;is1.len;i++)for(intj=0;js2.len;j++)if(s1.p[i]==s2.p[j])k++;int*t=newint[k];for(i=0,k=0;is1.len;i++)for(intj=0;js2.len;j++)if(s1.p[i]==s2.p[j])couts1.p[i]',';cout'\n';returnt;}voidSet::print(){for(inti=0;ilen;i++)coutp[i]',';cout'\n';}Set::~Set(){if(p)delete[]p;}voidmain(){intt1[]={1,2,3,4,5,6},t2[]={1,3,5,7,9,11,13,15},*c;Seta(t1,6),b(t2,8);cout集合a:\t;a.print();cout集合b:\t;b.print();cout交集c:\t;c=a&&b;delete[]c;}5.定义一个字符串类Str,Str类中重载“-”运算符,用来删除字符串中的指定字符。#includeioStream.h#includeString.hclassStr{char*s;public:Str(char*p=0);Str&operator=(Str&str);friendStr&operator-(Str&str,char*p);voidprint();~Str();};Str::Str(char*p){if(p==0)s=0;else{s=newchar[strlen(p)+1];strcpy(s,p);}}Str&Str::operator=(Str&str){if(s)delete[]s;s=newchar[strlen(str.s)+1];strcpy(s,str.s);return*this;}Str&operator-(Str&str,char*p){while(*p){if(*p='A'&&*p='Z'||*p='a'&&*p='z'){for(char*p1=str.s;*p1;p1++)if(*p==*p1||((*p='A'&&*p='Z')&&(*p1='a'&&*p1='z')&&(*p+'a'-'A'==*p1))||((*p='a'&&*p='z')&&(*p1='A'&&*p1='Z')&&(*p==*p1+'a'-'A')))for(char*p2=p1;*p2;p2++)*p2=*(p2+1);}p++;}returnstr;}voidStr::print(){couts'\n';}Str::~Str(){if(s)delete[]s;}voidmain(){char*s=Ok.;Strstr1(Givemesomecoffee,Jackson.),str2;cout原字符串;str1.print();str2=str1-s;//和下一条语句互换位置cout要删除的字符;coutsendl;cout删除后的字符串;str2.print();}9.4实验内容与指导1.定义一个复数类Complex,用成员函数重载“+”运算符,用友元函数重载和“-”运算符,完成两个复数的加法和减法运算。#includeiostream.hclassComplex{floatreal,image;public:Complex(floatr=0,floati=0){real=r;image=i;}Complexoperator+(Complex);friendComplexoperator-(Complex,Complex);voidprint(){coutreal+imageiendl;}};ComplexComplex::operator+(Complexc){Complext;t.real=real+c.real;t.image=image+c.image;returnt;}Complexoperator-(Complext1,Complext2){Complext;t.real=t1.real-t2.real;t.image=t1.image-t2.image;returnt;}voidmain(){Complexc1(25,50),c2,c3(100,20),c4;c2=c1+c3;cout复数相加:;c2.print();c4=c1-c3;cout复数相减:;c4.print();}2.定义一个字符串类STR,实现字符串中字符的循环移动。通过成员函数重载位运算符“”,使字符串左移n位,如“abdefijkl”左移4位后变成“efijklabd”;通过友元函数重载位运算符“”,使字符串右移n位。#includeiostream.h#includestring.hclassSTR{char*s;public:STR(char*p);voidoperator(intn);friendvoidoperator(STR&str,intn);voidprint();~STR();};STR::STR(char*p){s=newchar[strlen(p)+1];strcpy(s,p);}voidSTR::operator(intn){charch,*ptr;for(inti=0;in;i++){ch=*s;ptr=s;while(*ptr){*ptr=*(ptr+1);ptr++;}*(ptr-1)=ch;}}voidoperator(STR&str,intn){charch,*ptr;for(inti=0;in;i++){ptr=str.s+strlen(str.s)-1;ch=*ptr;while(ptrstr.s){*ptr=*(ptr-1);ptr--;}*(str.s)=ch;}}voidSTR::print(){couts'\n';}STR::~STR(){delete[]s;}voidmain(){chars[20];cin.getline(s,19);STRstr(s);str.print();str2;str.print();str4;str.print();}
本文标题:第九章解答
链接地址:https://www.777doc.com/doc-5861203 .html