什么是C++中的重载运算符?

Sou*_*lly 6 c++ operator-overloading

我意识到这是一个基本的问题,但我已经在网上搜索过,去了cplusplus.com,通读了我的书,我似乎无法掌握重载运算符的概念.cplusplus.com的一个具体示例是:

// vectors: overloading operators example
#include <iostream>
using namespace std;

class CVector {
  public:
    int x,y;
    CVector () {};
    CVector (int,int);
    CVector operator + (CVector);
};

CVector::CVector (int a, int b) {
  x = a;
  y = b;
}

CVector CVector::operator+ (CVector param) {
  CVector temp;
  temp.x = x + param.x;
  temp.y = y + param.y;
  return (temp);
}

int main () {
  CVector a (3,1);
  CVector b (1,2);
  CVector c;
  c = a + b;
  cout << c.x << "," << c.y;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

http://www.cplusplus.com/doc/tutorial/classes2/,但阅读它我仍然不理解它们.我只需要一个重载运算符的基本示例(我假设它是"CVector CVector :: operator +(CVector param)").

维基百科也有这个例子:

 Time operator+(const Time& lhs, const Time& rhs)
 {
   Time temp = lhs;
   temp.seconds += rhs.seconds;
   if (temp.seconds >= 60)
   {
     temp.seconds -= 60;
     temp.minutes++;
   }
   temp.minutes += rhs.minutes;
   if (temp.minutes >= 60)
   {
     temp.minutes -= 60;
     temp.hours++;
   }
   temp.hours += rhs.hours;
   return temp;
 }
Run Code Online (Sandbox Code Playgroud)

来自" http://zh.wikipedia.org/wiki/Operator_overloading "

我正在进行的当前任务我需要重载一个++和一个 - 运算符.

提前感谢您的信息,并对有些模糊的问题感到抱歉,遗憾的是我根本不确定.

Mic*_*urr 14

运算符重载是C++提供的技术,可让您定义如何将语言中的运算符应用于非内置对象.

在您的示例中,Time运算符的类运算符重载+:

Time operator+(const Time& lhs, const Time& rhs);
Run Code Online (Sandbox Code Playgroud)

通过该重载,您现在可以Time以"自然"方式对对象执行添加操作:

Time t1 = some_time_initializer;
Time t2 = some_other_time_initializer;

Time t3 = t1 + t2;    // calls operator+( t1, t2)
Run Code Online (Sandbox Code Playgroud)

操作符的重载只是一个函数,其特殊名称为"operator",后跟运算符重载的符号.大多数运营商都可能超载 - 不能是:

.  .*  :: and ?:
Run Code Online (Sandbox Code Playgroud)

您可以直接通过名称调用该函数,但通常不会(操作符重载点是能够正常使用运算符).

被调用的重载函数由对运算符的参数的正常重载决策决定 - 这就是编译器如何调用operator+()使用Time上面示例中的参数类型的方法.

重载++--递增和递减运算符时需要注意的另一件事是每个版本有两个版本 - 前缀和后缀形式.这些运算符的后缀版本需要一个额外的int参数(传递0并且没有其他目的,除了区分两种类型的运算符).C++标准有以下示例:

class X {
public:
    X&   operator++();      //prefix ++a
    X    operator++(int);   //postfix a++
};

class Y { };

Y&   operator++(Y&);        //prefix ++b
Y    operator++(Y&, int);   //postfix b++
Run Code Online (Sandbox Code Playgroud)

您还应该知道,重载的运算符不必执行与内置运算符类似的操作 - 或多或少的正常函数,它们可以执行任何您想要的操作.例如,标准库的IO流接口使用移位运算符来输出和输入流 - 这实际上与位移不同.但是,如果你试图对操作符重载过于花哨,那么对于那些试图遵循你的代码的人来说会引起很大的困惑(甚至可能在你以后查看代码时也是如此).

小心使用运算符重载.