重载++和+运算符

时间:2014-10-31 16:24:18

标签: c++

为什么我可以在LHS和RHS中重载和使用++运算符,而+只能在LHS模式下工作?

class B {
public:

    string operator ++ () { return "hello"; }
    string operator + () {  return "hello2"; }
};

int main ()
{
    B b;
    string s = +b ;
    s = b+ ; // compile error syntax error : ';'    

    s = b++; 
    s = ++b;

    return 0;
}

2 个答案:

答案 0 :(得分:6)

重载运算符只能使用与相应内置运算符相同的语法。内置++被定义为前缀或后缀运算符;内置+仅定义为前缀运算符(当然还有二元运算符)。

请注意,即使没有b+行,您的代码也无法编译,因为您错过了++的后缀版本:

string operator ++ (int) { return "postfix"; }

答案 1 :(得分:0)

  

为什么我可以在LHS和RHS中重载和使用++运算符

您的代码实际上是produces two errors

main.cpp:16:12: error: expected expression
    s = b+ ; // compile error syntax error : ';'    
           ^
main.cpp:18:10: error: cannot increment value of type 'B'
    s = b++; 
        ~^

所以你实际上没有重载后增量运算符,只有预增量运算符。但是,您的问题仍然存在,因为如果您愿意,可以重载后增加,但C ++不提供任何类似的语法来重载后缀一元加运算符。

C ++不会改变基于运算符重载的表达式中的运算符的解析方式。它只允许您重载已经存在的运算符,并且将完全解析这些运算符,就好像运算符重载不存在一样。只有在解析之后,C ++才会查找运算符重载以找出解析表达式的含义。因此,C ++提供了一种重载后增量运算符的方法,因为它已经处理了解增后运算符的解析,但它还没有处理解析后缀加运算符。

限制C ++运算符重载到现有运算符是因为如果解析器没有注意任意使用运算符,那么实现解析器会更简单。然而,这并不意味着它无法完成。例如,Swift语言允许任意运算符重载二进制,前缀一元和后缀一元运算符,包括创建completely new operators