在c ++中为一个操作数重载二元运算符

时间:2015-05-18 19:58:36

标签: c++ operator-overloading

你能否重载一个二元运算符,只能在C ++中只取一个操作数?

我尝试用类似这样的类来实现它:

#include <iostream>

using namespace std;

class IntWrap {
public:
    IntWrap operator=(int rhs) {
        val = rhs;
        return *this;
    }

    // No second operand for +
    IntWrap operator+() {
        IntWrap result;
        result = val + 1;
        return result;
    }

    int Val() {return val;}

private:
    int val;
};

这段代码实际上是用GCC编译的,这让我感到惊讶,它甚至没有给-Wall发出任何警告

我遇到的问题实际上是使用重载运算符。

这不会编译,因为GCC期望+之后的操作数:

int main() {
    IntWrap test;
    test = 0;

    test +; // GCC expects an operand after +

    return 0;
}

成员函数可以与test.operator+()一起使用,但实际上并不使用运算符。

更具体地说,是否只使用C ++标准允许的一个操作数重载二元运算符?如果是这样,是否可以使用运算符表示法调用重载函数,可能是通过对右侧操作数使用某种虚拟值?

另外,不用担心,我不打算在任何实际代码中使用它,我只是好奇,因为我找不到任何关于此的内容。

3 个答案:

答案 0 :(得分:2)

您没有重载二元运算符,而是unary +运算符。正确的用法是

IntWrap test;
test = 0;
+test;

答案 1 :(得分:2)

  

你能否重载一个二元运算符,只能在C ++中只取一个操作数?

不,你不能这样做。运算符重载不允许您更改语言的语法或运算符优先级。它只允许您更改使用运算符时发生的情况。

你做了什么

IntWrap operator+() { ... }

重载了一元+运算符。

你应该可以使用:

IntWrap test;
test = 0;
+test;

答案 2 :(得分:0)

N4140 [over.oper] / 6:

  

无法更改运算符的优先级,分组,或操作数

在您的代码中,您重载了一元+运算符,而不是二进制运算符。