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

标签 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;
}

来自 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;
 }

来自“http://en.wikipedia.org/wiki/Operator_overloading

我正在处理的当前作业需要重载一个++ 和一个 -- 运算符。

提前感谢您提供的信息,对于这个有点模糊的问题,我深表歉意,不幸的是,我根本不确定。

最佳答案

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

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

Time operator+(const Time& lhs, const Time& rhs);

通过重载,您现在可以以“自然”方式对 Time 对象执行加法操作:

Time t1 = some_time_initializer;
Time t2 = some_other_time_initializer;

Time t3 = t1 + t2;    // calls operator+( t1, t2)

运算符的重载只是一个带有特殊名称“运算符”的函数,后跟被重载的运算符的符号。大多数运算符都可以重载 - 不能重载的是:

.  .*  :: and ?:

你可以直接通过名称调用函数,但通常不会(运算符重载的目的是为了能够正常使用运算符)。

被调用的重载函数由运算符参数的正常重载决策决定 - 这就是编译器知道调用使用 Timeoperator+() 的方式> 上例中的参数类型。

重载 ++-- 递增和递减运算符时需要注意的另一件事是每个运算符都有两个版本 - 前缀和后缀形式。这些运算符的后缀版本采用额外的 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++

您还应该知道,重载运算符不必执行类似于内置运算符的操作 - 它们或多或少是正常功能,它们可以做任何您想做的事情。例如,标准库的 IO 流接口(interface)使用移位运算符进行流的输出和输入——这与位移完全不同。但是,如果您尝试对运算符重载过于花哨,就会给尝试遵循您的代码的人(甚至您以后查看代码时)造成很多困惑。

谨慎使用运算符重载。

关于c++ - 什么是 C++ 中的重载运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2406485/

相关文章:

c++ - 为什么 windows.h 禁用包警告?

c++ - '$OutDir'在Visual Studio的脚本文件中定义在哪里?

c++ - 使用或不使用 boost::bind() 创建一个 boost::thread

c++ - 将类型名称传递给模板化运算符

c++ - 段错误

c++ - 添加 watch 显示未定义标识符visual studio 2012,cpp

c++ - 类内部的成员变量分配在哪里?

c++ - 重载 * 运算符 - 必须采用零个或一个参数

c++ - 比较不同类型的对象是否被认为是好的设计?

c++ - 如果 lhs 或 rhs 对象是 float ,则 operator+ 的结果是 float