+ =运算符重载和级联?

时间:2014-02-04 17:19:20

标签: c++ operator-overloading

出于教育目的,我希望重载并级联使用+ =运算符。

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,不是吗?

感谢。

3 个答案:

答案 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,变量b1c1可以是floata。有关详细信息,请参阅this question中的

答案 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.
}