概述

运算符重载的实质函数重载.
运算符重载是通过创建运算符函数实现的。

运算符函数定义的一般格式:

<返回类型说明符>  operator <运算符符号>(<参数表>)

运算符函数重载一般有两种形式:重载为类的成员函数和重载为类的非成员函数(非成员函数通常是友元)。

一、成员函数运算符重载

当运算符重载为类的成员函数时,成员函数用this指针隐式地访问了类的一个对象,因此函数的参数个数比原来的操作数要少一个(后置一元运算符重载除外)。常见情况有以下三种:
(1) 二元运算符重载为类的成员函数时,函数只显式说明一个参数,该形参是运算符的右操作数。
(2) 前置一元运算符重载为类的成员函数时,不需要显式说明参数,即函数没有形参。
(3) 后置一元运算符重载为类的成员函数时,函数要带有一个整型形参。

以前置一元运算符重载的例子说明:(取负运算)

下面的实例演示了如何重载一元减(取负)运算符( - )
(来源:http://www.runoob.com/cplusplus/cpp-overloading.html )

#include <iostream>
using namespace std;
 
class Distance
{
   private:
      int feet;             
      int inches;           
   public:
      Distance(){
         feet = 0;
         inches = 0;
      }
      Distance(int f, int i){
         feet = f;
         inches = i;
      }
      void displayDistance()
      {
         cout << "F: " << feet << " I:" << inches <<endl;
      }
 
      Distance operator- ()       // 重载负运算符( - )
      {
         feet = -feet;
         inches = -inches;
         return Distance(feet, inches);
      }
};
int main()
{
   Distance D1(11, 10), D2(-5, 11);
 
   -D1;                     // 使用了重载运算符-
   D1.displayDistance();    
 
   -D2;                     // 使用了重载运算符-
   D2.displayDistance();    
 
   return 0;
}

结果:

F: -11 I:-10
F: 5 I:-11
再以二元运算符重载的例子说明:(加运算)

(来源:http://www.runoob.com/cplusplus/cpp-overloading.html )

#include <iostream>
using namespace std;
 
class Box
{
   public:
 
      double getVolume(void)
      {
         return length * breadth * height;
      }
      void setLength( double len )
      {
          length = len;
      }
      void setBreadth( double bre )
      {
          breadth = bre;
      }
      void setHeight( double hei )
      {
          height = hei;
      }
      
   
      Box operator+(const Box& b)       // 重载 + 运算符,用于把两个 Box 对象相加
      {
         Box box;
         box.length = this->length + b.length;
         box.breadth = this->breadth + b.breadth;
         box.height = this->height + b.height;
         return box;
      }
   private:
      double length;      // 长度
      double breadth;     // 宽度
      double height;      // 高度
};
// 程序的主函数
int main( )
{
   Box Box1;                
   Box Box2;                
   Box Box3;                
   double volume = 0.0;     
 
   // Box1 详述
   Box1.setLength(6.0); 
   Box1.setBreadth(7.0); 
   Box1.setHeight(5.0);
 
   // Box2 详述
   Box2.setLength(12.0); 
   Box2.setBreadth(13.0); 
   Box2.setHeight(10.0);
 
   // Box1 的体积
   volume = Box1.getVolume();
   cout << "Volume of Box1 : " << volume <<endl;
 
   // Box2 的体积
   volume = Box2.getVolume();
   cout << "Volume of Box2 : " << volume <<endl;
 
   // 把两个对象相加,得到 Box3
   Box3 = Box1 + Box2;
 
   // Box3 的体积
   volume = Box3.getVolume();
   cout << "Volume of Box3 : " << volume <<endl;
 
   return 0;
}

结果:

Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400

二、友元函数运算符重载

一般格式为:

friend <函数类型> operator <运算符>(<参数表>)

当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有变化,所有的操作数都必须通过函数的形参进行传递,函数的参数与操作数自左至右一一对应。

调用友元函数运算符的格式如下:

    operator <运算符>(<参数1>,<参数2>)

    它等价于: <参数1><运算符><参数2>

    例如:a+b等价于operator +(a,b)。

实例:输入/输出运算符重载( << 和 >> )
C++ 可以通过重载流提取运算符>>和流插入运算符 <<, 来操作对象等用户自定义的数据类型。

在这里,有一点很重要,我们需要把运算符重载函数声明为类的友元函数,这样我们就能不用创建对象而直接调用函数

下面的实例演示了如何重载提取运算符 >> 和插入运算符 <<。
(来源:http://www.runoob.com/cplusplus/input-output-operators-overloading.html )

#include <iostream>
using namespace std;
class Distance
{
   private:
      int feet;           
      int inches;       
   public:
      
      Distance(){
         feet = 0;
         inches = 0;
      }
      Distance(int f, int i){
         feet = f;
         inches = i;
      }
      friend ostream &operator<<( ostream &output, const Distance &D )//重载输出运算符
      { 
         output << "F : " << D.feet << " I : " << D.inches;
         return output;            
      }
 
      friend istream &operator>>( istream  &input, Distance &D )//重载输入运算符
      { 
         input >> D.feet >> D.inches;
         return input;            
      }
};
int main()
{
   Distance D1(11, 10), D2(5, 11), D3;
 
   cout << "Enter the value of object : " << endl;
   cin >> D3;                             //使用输入重载运算符>>
   cout << "First Distance : " ;
   cout<< D1 << endl;                    //使用输出重载运算符<<
   cout << "Second Distance :";
   cout << D2 << endl;                   //使用输出重载运算符<<
   cout << "Third Distance :";
   cout << D3 << endl;                   //使用输出重载运算符<<
 
 
   return 0;
}

输出结果:

Enter the value of object :
70
10
First Distance : F : 11 I : 10
Second Distance :F : 5 I : 11
Third Distance :F : 70 I : 10

三、注意事项

1、运算重载符不可以改变语法结构。

2、运算重载符不可以改变操作数的个数。

3、运算重载符不可以改变优先级。

4、运算重载符不可以改变结合性。

5、如下图:

typescript Symbol 重载运算符 重载运算符调用_运算符