运算符在C ++中重载'+'运算符

时间:2010-09-03 06:43:42

标签: c++ operator-overloading

我遇到的问题是下面的代码在Visual Studio 2008上运行。当你有一个要重载的语句时,如何编写operator +的函数定义?

class Distance
{
    private:
        int feet,inches;
};

main......

Distance Obj, Obj1(2, 2);

Obj = 3 + Obj1; // This line here

Obj1+3很简单,但是这个编译器如何知道它必须重载?

假设我必须将值3添加到feet的数据成员Obj1

4 个答案:

答案 0 :(得分:6)

现在有几个答案建议使用非成员operator+重载来允许“添加”Distanceint个对象。这实际上没有意义:将Distance(具有单位)添加到int,这不是什么意思?

但是,将两个Distance对象一起添加是有意义的。如果你有一个两英尺的距离,并增加另一个三英尺的距离,你得到五英尺的距离。这是有道理的。

您可以通过在operator+个对象之间重载Distance来实现此目的(为简单起见,我假设您的Distance只有一个包含英寸的字段。在现实世界中应用程序,你不希望有英寸和英尺的单独字段。你可能想要使用SI单位,如米,但这取决于应用程序,完全取决于你):

Distance operator+(const Distance& lhs, const Distance& rhs)
{
    return Distance(lhs.inches + rhs.inches);
}

但是,如果您希望能够按照

的方式执行某些操作,这对您没有帮助
Distance d;
d = d + 42; // assume 42 has the same units as a Distance object has

为了使其有意义,您可以使用转换构造函数:

struct Distance
{
    Distance(int in = 0) : inches(in) { }
private:
    int inches;
};

这里的构造函数是一个转换构造函数,因为它不是explicit,可以用一个参数调用。它允许将单个int(或可隐式转换为int的值)转换为Distance对象。这允许你写

Distance d;
d = d + 42;

为什么这与使用operator+Distance参数的int重载不同?简单:它强制在添加之前从int转换为Distance,因此实际添加不必关心其操作数:它只是将两个距离加在一起并让{{{ 1}}构造函数处理需要进行的任何转换。

答案 1 :(得分:3)

您需要编写一个自由函数(在class之外):

Distance operator+(int lhs, const Distance& rhs)
{
  return ...;
}

如果...需要使用Distance的私人成员,请在Distance中将其设为好友。

class Distance
{
  ...
  friend Distance operator+(int lhs, const Distance& rhs);
};

最后,如果您希望左侧有+ Distance,请按上述定义另一个operator+重载,但DistanceDistance第一个论点。

所有这些说,我会避免做你看起来正在做的事情。作为Distance课程的用户,我不知道你在做什么会增加3英尺,3英寸或3米。如果您不打算使用SI单位(米),则不应允许添加非{{1}}值。

答案 2 :(得分:3)

除了重载+运算符以及两个Distance对象之外,您应该避免在其他答案中指出operator+(const Distance &, int)重载。最好定义一些常量,如:

const Distance feet(1,0);
const Distance inch(0,1);

并重载operator*(int, const Distance &),以便您可以写:

Distance dist = 3 * feet + 5 * inch;
Distance dist2 = dist + 2 * feet;

更具可读性。

答案 3 :(得分:1)

通常,该表单的运算符将声明为:

Distance operator+(int lhs, const Distance& rhs) {
  // Assuming the int value represents feet
  return Distance(rhs.feet + lhs, rhs.inches);
}

您可能还想定义对称:

Distance operator+(const Distance& lhs, int rhs) {
  // Assuming the int value represents feet
  return Distance(lhs.feet + rhs, lhs.inches);
}

另外,我建议你听听James McNellis的建议 - 如果你只有一个成员代表一个单位的长度,你的工作将会简化。