实验九 友元与运算符重载
【实验目的】
1、 掌握友元函数的使用方法;
2、 掌握使用运算符重载方法;
【实验内容】
1、 定义一个复数类,重载“-=”运算符,使这个运算符能直接完成复数的“-=”运算。
•分别用成员函数与友元函数编写运算符重载函数;
•在主函数中定义复数对象c1(10,20)、c2(15,30),进行c2-=c1的复数运算,并输出c1、c2的复数值。
2、 定义一个数组类Array:
•其私有数据成员为整型一维数组a[10];
•通过构造函数给数组赋初值;
•用show函数显示数组的元素值;
•用成员函数重载运算符“+”,直接实现两个一维数组对应元素相加的运算。•在主函数中定义数组a、b分别为:
int a[10]={1,2,3,4,5,6,7,8,9,10}; int b[10]={4,5,6,7,8,9,10,11,12,13};
•用Array定义三个数组对象arr1(a)、arr2(b)、arr3,执行arr3=arr1+arr2运算,输出arr3的数组元素值。
•类似地,用友元函数重载运算符“+=”,实现复合赋值运算:arr1+=arr2,并输出arr1的元素值。
3、 定义一个人民币类Money;
•类中数据成员为元、角、分;
•用成员函数与友元函数重载“――”运算符,实现人民币对象的减1运算;
•在主函数中定义人民币对象m1=10元8角5分及对象m2、m3,对m1作前置“――”并赋给m2。对m1作后置“――”并赋给m3。显示m1、m2、m3的结果。
【实验要求】
1、编写实验内容要求的程序、编译并调试通过;
2、实验报告中记录编程过程中出现的错误与改正方法;
3、总结友元函数的作用;
4、总结运算符重载时的注意事项;
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 class Complex 5 {public: 6 Complex(double r=0,double i=0){ real=r;image=i;} 7 void operator-=(Complex&); 8 void display(string); 9 private: 10 double real,image; 11 }; 12 void Complex::operator -=(Complex&c2) 13 { 14 real=real-c2.real; 15 image=image-c2.image; 16 } 17 void Complex::display(string str) 18 { cout<<str<<"=("<<real<<","<<image<<"i)"<<endl;} 19 int main(){ 20 Complex c1(10,20),c2(15,30); 21 c1.display("c1"); 22 c2-=c1; 23 c2.display("c2"); 24 return 0; 25 }
1 #include<iostream> 2 using namespace std; 3 class Array 4 {public: 5 Array(){} 6 Array(int *m){ 7 int i; 8 for(i=0;i<10;i++) 9 a[i]=*(m+i);} 10 Array operator+(Array &); 11 friend void operator+=(Array &t1,Array &t2); 12 void show(){ 13 int i; 14 cout<<"{"; 15 for(i=0;i<10;i++){ 16 cout<<a[i]; 17 if(i!=9) cout<<",";} 18 cout<<"}"<<endl; 19 } 20 private: 21 int a[10]; 22 }; 23 Array Array:: operator+(Array &p) 24 { 25 Array a3; 26 int i; 27 for(i=0;i<10;i++) 28 a3.a[i]=a[i]+p.a[i]; 29 return a3; 30 } 31 void operator+=(Array &t1,Array &t2) 32 { 33 int i; 34 for(i=0;i<10;i++) 35 t1.a[i]=t1.a[i]+t2.a[i]; 36 } 37 int main(){ 38 int a[10]={1,2,3,4,5,6,7,8,9,10}; 39 int b[10]={4,5,6,7,8,9,10,11,12,13}; 40 Array arr1(a),arr2(b),arr3;//定义两个构造函数,一个有参数一个没有参数。 41 arr3=arr1+arr2; 42 arr3.show(); 43 arr1+=arr2; 44 arr1.show(); 45 return 0; 46 }
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 class Money 5 {public: 6 Money(){ yuan=0;jiao=0;fen=0;} 7 Money(int y,int j,int f); 8 Money operator--(); 9 friend Money operator--(Money &,int); 10 void show(string); 11 private: 12 int yuan,jiao,fen; 13 }; 14 Money::Money(int y,int j,int f){ yuan=y;jiao=j;fen=f;} 15 Money Money::operator--(){ yuan--;jiao--;fen--;return *this;}//前置 16 Money operator--(Money &p,int){ Money temp(p);p.yuan--;p.jiao--;p.fen--;return temp;}//后置 17 void Money::show(string str){ cout<<str<<"("<<yuan<<","<<jiao<<","<<fen<<")"<<endl;} 18 int main(){ 19 Money m1(10,8,5),m2,m3; 20 m2=--m1; 21 m2.show("m2=--m1="); 22 m3=m1--; 23 m3.show("m3=m1--="); 24 m1.show("m1="); 25 return 0; 26 }
【错误及改正方法】:一,在c2-c1之后再赋值给c2我开始采用定义一个c3把值赋给c3的形式,后来我发现这不符合题意,改进了运算符重载的方式;二,在进行两个数组元素的相加时(+=)时,双目运算符一般使用友元函数。
【实验分析】:作为一个类的友元函数,这个函数可以对这个类的私有成员函数进行访问,但是值得注意的是,这个访问是单向的,即友元函数可以访问类的数据,而不可逆,相对来说,友元函数应该尽量减少使用。
运算符重载时的注意事项:只能对C++语言已有的运算符进行重载,不能改变运算符操作数的个数,不能改变运算符原有的优先级,不能改变运算符原有的结合方式和语法结构,重载运算符的函数不能有默认的参数等。