我遇到的问题是下面的代码在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
。
答案 0 :(得分:6)
现在有几个答案建议使用非成员operator+
重载来允许“添加”Distance
和int
个对象。这实际上没有意义:将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+
重载,但Distance
为Distance
第一个论点。
所有这些说,我会避免做你看起来正在做的事情。作为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的建议 - 如果你只有一个成员代表一个单位的长度,你的工作将会简化。