2014-10-31 52 views
0

爲什麼我可以在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

因爲「b +」是該運算符的無效語句,是否過載 – 2014-10-31 16:27:11

+1

C僅在前綴形式中定義了一元「+」,而在前綴和後綴形式中定義了「++」和「 - 」。 C++允許你指定爲一個表達式執行什麼,但是不會改變什麼是允許或不允許的基本語法,所以你仍然只能得到一元'+'的前綴形式。 – 2014-10-31 16:27:16

回答

6

重載操作符只能與相應的內置語法使用相同的語法。內置的++被定義爲前綴或後綴運算符;內置的+僅被定義爲前綴運算符(當然作爲二元運算符)。

注意,你的代碼甚至不會沒有b+行編譯,因爲你缺少的++後綴版本:

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

我的visual C++編譯我的代碼沒有問題。但是當我包括你的線時,我得到了不同的行爲(這是預期的)。但爲什麼(int)用於?爲什麼不字符例如? – vico 2014-10-31 16:40:11

+0

@vico:我不知道爲什麼VC++可以接受它,但更標準的編譯器不:http://ideone.com/oiIzga。 '(int)'是指示後綴形式的方式。沒有什麼特別的理由,爲什麼選擇而不是「字符」或什麼;但'int'被選中,所以這就是我們必須使用的。 – 2014-10-31 16:45:07

+0

似乎VC++允許使用postfix運算符,如果你已經定義了前綴運算符(並給它相同的行爲),但會發出警告([C4620](http://msdn.microsoft.com/en-us /library/12waye2f%28v=vs.90%29.aspx))。 – 2014-10-31 16:53:15

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