什么是C++运算符重载

时间:2014-11-01 21:35    点击:

所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能,因此,一个函数名就可以用来代表不同功能的函数,也就是”一名多用”。

运算符也可以重载。实际上,我们已经在不知不觉之中使用了运算符重载。例如,大 家都已习惯于用加法运算符”+”对整数、单精度数和双精度数进行加法运算,如5+8, 5.8 +3.67等,其实计算机对整数、单精度数和双精度数的加法操作过程是很不相同的, 但由于C++已经对运算符”+”进行了重载,所以就能适用于int, float, doUble类型的运算。

又如”<<“是C++的位运算中的位移运算符(左移),但在输出操作中又是与流对 象cout 配合使用的流插入运算符,”>>“也是位移运算符(右移),但在输入操作中又是与流对象 cin 配合使用的流提取运算符。这就是运算符重载(operator overloading)。C++系统对”<<“和”>>“进行了重载,用户在不同的场合下使用它们时,作用是不同 的。对”<<“和”>>“的重载处理是放在头文件stream中的。因此,如果要在程序中用”<<“和”>>”作流插入运算符和流提取运算符,必须在本文件模块中包含头文件stream(当然还应当包括”using namespace std“)。

现在要讨论的问题是:用户能否根据自己的需要对C++已提供的运算符进行重载,赋予它们新的含义,使之一名多用。譬如,能否用”+”号进行两个复数的相加。在C++中不能在程序中直接用运算符”+”对复数进行相加运算。用户必须自己设法实现复数相加。例如用户可以通过定义一个专门的函数来实现复数相加。见例10.1。

[例10.1] 通过函数来实现复数相加。

			
  1. #include <iostream>
  2. using namespace std;
  3. class Complex //定义Complex类
  4. {
  5. public:
  6. Complex( ){real=0;imag=0;} //定义构造函数
  7. Complex(double r,double i){real=r;imag=i;} //构造函数重载
  8. Complex complex_add(Complex &c2); //声明复数相加函数
  9. void display( ); //声明输出函数
  10. private:
  11. double real; //实部
  12. double imag; //虚部
  13. };
  14.  
  15. Complex Complex::complex_add(Complex &c2)
  16. {
  17. Complex c;
  18. c.real=real+c2.real;
  19. c.imag=imag+c2.imag;
  20. return c;
  21. }
  22.  
  23. void Complex::display( ) //定义输出函数
  24. {
  25. cout<<"("<<real<<","<<imag<<"i)"<<endl;
  26. }
  27. int main( )
  28. {
  29. Complex c1(3,4),c2(5,-10),c3;//定义3个复数对象
  30. c3=c1.complex_add(c2); //调用复数相加函数
  31. cout<<"c1="; c1.display( );//输出c1的值
  32. cout<<"c2="; c2.display( );//输出c2的值
  33. cout<<"c1+c2="; c3.display( );//输出c3的值
  34. return 0;
  35. }
运行结果如下:
c1=(3+4i)
c2=(5-10i)
c1+c2=(8,-6i)

结果无疑是正确的,但调用方式不直观、太烦琐,使人感到很不方便。能否也和整数的加法运算一样,直接用加号”+”来实现复数运算呢?如
    c3=c1+c2;
编译系统就会自动完成c1和c2两个复数相加的运算。如果能做到,就为对象的运算提供了很大的方便。这就需要对运算符”+“进行重载。

来源:未知//所属分类:基础教程/更新时间:2014-11-01 21:35
顶一下
(1)
100%
踩一下
(0)
0%
上一篇:C++类模板详解
下一篇:C++运算符重载的方法
相关内容