实验7 运算符重载(P289-P292)

匿名 (未验证) 提交于 2019-12-03 00:32:02

实验目的和要求

实验内容

1.调试下列程序

  1. "font-family:SimSun;font-size:16px;">//sy7_1.cpp
  2. #include<iostream>
  3. usingnamespace
  4. class
  5. public
  6. double
  7. doubledouble
  8. const
  9. const
  10. const
  11. const
  12. friendvoidconst
  13. private
  14. double
  15. inlineconst
  16. return
  17. inlineconst
  18. return
  19. inlineconst
  20. return
  21. inlineconst
  22. return
  23. voidconst
  24. if
  25. "i"
  26. else
  27. "+"<<c.imag<<"i"
  28. int
  29. return
//sy7_1.cpp #include<iostream> using namespace std; class complex {     public:         complex(){real=imag=0.0;}         complex(double r){real=r;imag=0.0;}         complex(double r,double i){real=r;imag=i;}         complex operator + (const complex &c);         complex operator - (const complex &c);         complex operator * (const complex &c);         complex operator / (const complex &c);         friend void print(const complex &c);     private:         double real,imag; }; inline complex complex::operator + (const complex &c) {     return complex(real+c.real,imag+c.imag); } inline complex complex::operator - (const complex &c) {     return complex(real-c.real,imag-c.imag); } inline complex complex::operator * (const complex &c) {     return complex(real*c.real-imag*c.imag,real*c.imag+imag*c.real); } inline complex complex::operator / (const complex &c) {     return complex((real*c.real+imag*c.imag)/(c.real*c.real+c.imag*c.imag),(imag*c.real-real*c.imag)/(c.real*c.real+c.imag*c.imag)); } void print(const complex &c) {     if(c.imag<0)         cout<<c.real<<c.imag<<"i";     else         cout<<c.real<<"+"<<c.imag<<"i"; } int main() {     complex c1(2.0),c2(3.0,-1.0),c3;     c3=c1+c2;     cout<<"\nc1+c2= ";     print(c3);     c3=c1-c2;     cout<<"\nc1-c2= ";     print(c3);     c3=c1*c2;     cout<<"\nc1*c2= ";     print(c3);     c3=c1/c2;     cout<<"\nc1/c2= ";     print(c3);     c3=(c1+c2)*(c1-c2)*c2/c1;     cout<<"\n(c1+c2)*(c1-c2)*c2/c1= ";     print(c3);     cout<<endl;     return 0; }

写出程序的输出结果,并解释


2.调试下列程序

  1. "font-family:SimSun;""font-size:16px;">//sy7_1.cpp
  2. #include<iostream>
  3. usingnamespace
  4. class
  5. public
  6. double
  7. doubledouble
  8. friendconstconst
  9. friendconstconst
  10. friendconstconst
  11. friendconstconst
  12. friendvoidconst
  13. private
  14. double
  15. constconst
  16. return
  17. constconst
  18. return
  19. constconst
  20. return
  21. constconst
  22. return
  23. voidconst
  24. if
  25. "i"
  26. else
  27. "+"<<c.imag<<"i"
  28. int
  29. return
//sy7_1.cpp #include<iostream> using namespace std; class complex {     public:         complex(){real=imag=0.0;}         complex(double r){real=r;imag=0.0;}         complex(double r,double i){real=r;imag=i;}         friend complex operator + (const complex &c1,const complex &c2);         friend complex operator - (const complex &c1,const complex &c2);         friend complex operator * (const complex &c1,const complex &c2);         friend complex operator / (const complex &c1,const complex &c2);         friend void print(const complex &c);     private:         double real,imag; }; complex operator + (const complex &c1,const complex &c2) {     return complex(c1.real+c2.real,c1.imag+c2.imag); } complex operator - (const complex &c1,const complex &c2) {     return complex(c1.real-c2.real,c1.imag-c2.imag); } complex operator * (const complex &c1,const complex &c2) {     return complex(c1.real*c2.real-c1.imag*c2.imag,c1.real*c2.imag+c1.imag*c2.real); } complex operator / (const complex &c1,const complex &c2) {     return complex((c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag),(c1.imag*c2.real-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag)); } void print(const complex &c) {     if(c.imag<0)         cout<<c.real<<c.imag<<"i";     else         cout<<c.real<<"+"<<c.imag<<"i"; } int main() {     complex c1(2.0),c2(3.0,-1.0),c3;     c3=c1+c2;     cout<<"\nc1+c2= ";     print(c3);     c3=c1-c2;     cout<<"\nc1-c2= ";     print(c3);     c3=c1*c2;     cout<<"\nc1*c2= ";     print(c3);     c3=c1/c2;     cout<<"\nc1/c2= ";     print(c3);     c3=(c1+c2)*(c1-c2)*c2/c1;     cout<<"\n(c1+c2)*(c1-c2)*c2/c1= ";     print(c3);     cout<<endl;     return 0; }

写出程序的输出结果,并解释

3.定义一个Time类用来保存时间(时,分,秒),通过重载操作符“+”实现两个时间的相加。(sy7_3.cpp)

编写程序如下:

  1. "font-family:SimSun;font-size:16px;"//sy7_3.cpp
  2. class
  3. public
  4. //无参构造函数
  5. intintint//重载构造函数
  6. //操作符重载为成员函数,返回结果为Time类
  7. void
  8. private
  9. int
  10. int
  11. return
  12. void
  13. "%d:%d:%d\n"
  14. int
  15. return
 //sy7_3.cpp     #include <stdio.h>     class  Time     {     public:       Time(){ hours=0;minutes=0;seconds=0;} //无参构造函数       Time(int h, int m,int s)  //重载构造函数       {                hours=h; minutes=m; seconds=s;       }       Time operator +(Time&);  //操作符重载为成员函数,返回结果为Time类       void gettime();     private:       int hours,minutes,seconds;     };     Time Time::operator +(Time& time)     {     int h,m,s;     s=time.seconds+seconds;     m=time.minutes+minutes+s/60;     h=time.hours+hours+m/60;     Time result(h,m%60,s%60);     return result;     }     void Time::gettime()     {     printf("%d:%d:%d\n",hours,minutes,seconds);     }  int main( )     {     Time t1(20,30,40),t2(3,15,20),t3;     t3=t1+t2;     t3.gettime();     return 0; }

程序输出结果如下:



分析与讨论

答:运算符函数重载一般有两种形式:重载为类的成员函数和重载为类的非成员函数。非成员函数通常是友元。(可以把一个运算符作为一个非成员、非友元函数重载;但是,这样的运算符函数访问类的私有和保护成员时,必须使用类的公有接口中提供的设置数据和读取数据的函数,调用这些函数时会降低性能。可以内联这些函数以提高性能。)

this指针隐式地访问了类的一个对象,它充当了运算符函数最左边的操作数。因此:双目运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。前置单目运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。后置单目运算符重载为类的成员函数时,函数要带有一个整型形参。

this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应。

实验总结

运算符重载的定义,运算符重载就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。重载运算符必须遵循的规则有:重载运算符必须符合语言语法、不能重载内部C++数据类型进行操作的运算符、不能创建新的运算符、不能重载. .* :: ?:这些运算符、重载运算符要保持原有的基本语义不变。若用成员函数重载运算符需要的参数的个数总比它的操作数少一个,若用友元函数重载运算符需要的参数的个数总比它的操作数一样多。同时也多运算符重载的使用方法有了一定的了解。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!