【问题标题】:Operator overloading in C++ - why do we need to pass parameter as const & (...)?C++ 中的运算符重载 - 为什么我们需要将参数作为 const & (...) 传递?
【发布时间】:2013-11-16 09:26:58
【问题描述】:

假设我想重载一个运算符 ==。我有一个类向量和以下方法:

bool operator ==( const Vector & v )
{
    if(( this->x == v.x ) &&( this->y == v.y ) )
         return true;
    else
         return false;

}

为什么我需要将一个对象(在本例中为 v)作为常量地址传递给该对象?我知道 - const 强制程序员不要修改传递的对象,但为什么 &?

我的第二个问题涉及运算符重载,例如 +=、*= 等。 请看这段代码:

Vector operator +( const Vector & v )
{
    return Vector( this->x + v.x, this->y + v.y );
}

// vs
Vector & operator +=( const Vector & v )
{
    this->x += v.x;
    this->y += v.y;
    return * this;
}

在第二种情况下,我们也可以返回一个新对象。为什么我们返回相同的、递增的对象?

【问题讨论】:

  • A) 这样您就不会在不需要时制作副本。 B)所以你可以传递一个派生类型并获得动态调度。
  • += 返回一个值,使其能够以与内置运算符相同的方式使用(“do as the ints do”)。 a = (b += c) 在异常用法时是有效的。
  • operator== 的正文可以简化为{ return x == v.x && y == v.y; }

标签: c++ visual-studio-2010 operator-overloading


【解决方案1】:

您不必这样做,只是希望避免不必要地复制对象。

对于您的第二个问题,您不必这样做,但它使 += 对 Vector 的操作与对 int 或 double 的操作类似

【讨论】:

    【解决方案2】:

    对于第二个问题:如果您写a+=5; 或a*=10;,您通常期望原始变量 a 将被添加或相乘...如果您返回原始对象或新对象取决于您,但您可以如果您使用它与原始含义反直觉地使用它会混淆其他同事......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-08
      • 1970-01-01
      • 2018-09-14
      • 2019-12-14
      • 2017-11-18
      • 2014-07-24
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多