出于教育目的,我希望重载并级联使用+ =运算符。
class a {
public:
a();
a& operator+= (float f);
private:
float aa;
}
a() {
aa = 0;
}
a& operator+= (float f) {
aa += f;
return *this;
}
a b;
b += 1.0; // Works.
b += 1.0 += 1.0; // Error : Expression must be a modifiable lvalue.
我不明白为什么以上不起作用(除了可能的语法错误 - 没有尝试编译此示例代码)。在重载的operator + =方法中返回* this,我希望在b对象上调用第二个+ = 1.0,不是吗?
感谢。
答案 0 :(得分:26)
b += 1.0 += 1.0;
+=
的关联性是从右到左。所以上面解释为:
(b += (1.0 += 1.0));
这有意义吗? NO。
为了使其有效,您需要将其写为:
(b += 1.0) += 1.0;
希望有所帮助。
答案 1 :(得分:1)
请注意,为了让class a
给用户带来最少的惊喜,最好也定义成员函数
a& operator+=(a const&);
以及非会员职能
a operator+(a const&, a const&);
a operator+(a const&, float);
a operator+(float, a const&);
每个都是根据成员operator+=
重载之一定义的。然后你可以写
a1 += b1 + c1;
其中a1
的类型为a
,变量b1
,c1
可以是float
或a
。有关详细信息,请参阅this question中的c++-faq。
答案 2 :(得分:0)
只是为了添加你得到的精美答案。您可能对转换构造函数和/或转换运算符感兴趣。例如:
class a {
public:
a();
a(float f);
a& operator+= (float f);
operator float() const;
private:
float aa;
};
a::a() {
aa = 0;
}
a::a(float f) {
aa = f;
}
a& a::operator+= (float f) {
aa += f;
return *this;
}
a::operator float() const {
return aa;
}
int main()
{
a b = 1.0;
b += 1.0; // Works.
b += (a)1.0 += 1.0; // Works.
}
或者没有转换运算符可能更好,但operator+=(const a&);
class a {
public:
a();
a(float f);
a& operator+= (float f);
a& operator+= (const a & x);
private:
float aa;
};
a::a() {
aa = 0;
}
a::a(float f) {
aa = f;
}
a& a::operator+= (float f) {
aa += f;
return *this;
}
a& a::operator+= (const a & x) {
aa += x.aa;
return *this;
}
int main()
{
a b = 1.0;
b += 1.0; // Works.
b += (a)1.0 += 1.0; // Works.
}