在这种情况下,运算符重载如何工作?

时间:2017-08-19 04:32:14

标签: c++

我在这段代码中得到了这个运算符重载的工作原理.....

class operatorOver {
public:
    int a, b, c;
};

operatorOver operator+(const operatorOver &a, const operatorOver &b) {
    operatorOver aa;
    aa.a = b.a + a.a;
    return aa;
}

int main()
{
    operatorOver aaa, bbb, ccc;

    aaa.a = 100;
    bbb.a = 200;
    ccc = aaa + bbb;

    cout << ccc.a << endl;

    system("pause");
};

但是这个版本我不明白这个版本是如何工作的......

class operatorOver {
public:
    operatorOver operator+(const operatorOver &a) {
        operatorOver aa;
        aa.a = (*this).a + a.a;
        return aa;
    }

    int a, b, c;
};

int main()
{
    operatorOver aaa, bbb, ccc;

    aaa.a = 100;
    bbb.a = 200;
    ccc = aaa + bbb;

    cout << ccc.a << endl;

    system("pause");
};

我展示的第一个,我假设运算符重载的代码在两个对象类中进行,以使其工作...

但是第二个例子怎么表明我不需要在它的参数中创建另一个对象类但仍然可以...当你看到main()时你看到了还有2个对象类仍在传递中....我迷失了。

2 个答案:

答案 0 :(得分:3)

在第二个示例中,传递了两个对象。有a,还有this。传递为this的对象是操作的左侧。

另请注意,您的成员operator+应为const,因为它不会改变this的任何数据成员。

您的成员运算符也会调用未定义的行为,因为您使用的是未分配的值:

// The member function
operatorOver operator+(const operatorOver &a) {
    operatorOver aa;

    // What is the value of aa.a? Undefined behavior!
    aa.a = aa.a + a.a;
    return aa;
}

要等同于你的非成员函数,它应该是这个实现:

// The member function
operatorOver operator+(const operatorOver &a) const {
    operatorOver aa;

    // Member `a`, could be written `this->a`
    aa.a = a + a.a;
    return aa;
}

答案 1 :(得分:3)

某些二元运算符(例如+)可以作为成员函数和非成员函数重载。

+作为成员函数重载时,需要使用一个参数声明该函数。当运算符用作:

a + b

呼叫已解决为

a.operator+(b);

当它作为非成员函数重载时,需要使用两个参数声明该函数。当运算符用作:

a + b

呼叫已解决为

operator+(a, b);

进一步阅读:http://en.cppreference.com/w/cpp/language/operators