2010-08-19 46 views
1

可能重复:
Overloading += in c++过载+ =运算符如果+过载?

我需要重载+ =运算符,如果我过载+或将编译器知道该怎么办?

谢谢。

+0

如果您为两个对象重载+,编译器**将不会**了解有关+ =的任何内容。所以 - 答案是** YES **。 – 2010-08-19 20:35:36

+0

你可能也想重载相关的运算符,比如++和可能的-'s集合。 – 2010-08-19 20:40:08

+1

啊,重复:http://stackoverflow.com/questions/1092331/overloading-in-c。 – GManNickG 2010-08-19 20:40:30

回答

2

您需要重载两者。

但是,如果顺序颠倒,你可以重用代码:

struct foo 
{ 
    // this is the "core" operation, because it's mutating (changes this) 
    foo& operator+=(const foo&) 
    { 
     // ... 
     return *this; 
    } 

}; 

foo operator+(const foo& lhs, const foo& rhs) 
{ 
    foo ret = lhs; 
    ret += rhs;   
    return ret; 
} 

您进行复印,操作上该副本,并将其返回。

+0

我不相信你最后的陈述是真实的。在'operator +'在函数内部复制副本的情况下总体上会导致更少的副本。规范形式应该(恕我直言)是:'foo operator +(const foo&lhs,const foo&rhs){foo ret(lhs); ret + = rhs;返回ret; ''。 – 2010-08-19 20:46:50

+0

我喜欢Charles的形式建议,因为它对我来说更清楚。但我相信GMan使用的格式允许编译器更轻松地使用RVO。所以我想我只需要习惯这种新的形式(直到编译器赶上,然后我可以回到旧的形式)。 – 2010-08-19 20:50:30

+0

我依赖于很多因素,但除非编译器使用'operator + ='的内部部分(而不是将它用作直接函数调用),否则我的表单将比通过值版本传递第一个参数。工作中有几个因素。首先,从函数签名中,调用者无法最优地知道它为参数创建的副本可能是返回值;这是功能内部已知的。其次,虽然'operator + ='返回一个引用,但是签名本身并不要求这是'* this',即使我们知道它应该是。 – 2010-08-19 20:54:35