C++实验九

实验九  友元与运算符重载

【实验目的】

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++语言已有的运算符进行重载,不能改变运算符操作数的个数,不能改变运算符原有的优先级,不能改变运算符原有的结合方式和语法结构,重载运算符的函数不能有默认的参数等。

转载于:https://www.cnblogs.com/poppybloom/p/3472213.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值