除'new','delete','< <'&'>>'運算符外,還有哪些其他運算符可以在類上下文之外的C++中重載?可重載(用作定界符逗號)運算符在C++中重載
回答
下面的ope rators(通過空間delimitted)可以被重載作爲非成員函數:
new delete new[] delete[] + - */% ˆ & | ˜ ! < > += -= *= /= %= ˆ=
&= |= << >> >>= <<= == != <= >= && || ++ -- , ->*
以下必須非靜態成員函數:
:->() [] =
不能被重載以下
. .* :: ?: # ##
轉換運算符也必須是成員函數。
僅僅因爲它有一個'='並不意味着它不能作爲非成員操作符重載。以下是良好的形成:
struct A { };
A operator +=(A,A) { return A(); }
A a = A()+=A();
和前綴和後綴增量和減量運算確實可以被定義爲非成員:
13.5.7稱爲操作者++的用戶定義的函數實現前綴和後綴++運算符。如果此函數是不帶參數的成員函數,或者是具有一個類或枚舉類型參數的非成員函數,則它爲該類型的對象定義前綴increment operator ++。如果函數是一個帶有一個參數(應該是int類型的)的成員函數,或者是帶有兩個參數的非成員函數(其中第二個參數的類型應該是int),那麼它定義後綴增量運算符++那種類型。當由於使用++運算符而調用後綴增量時,int 參數的值將爲零。
前綴和後綴減量運算符 - 的處理方式類似
第13.5款的標準涵蓋了這一點。
希望這會有所幫助。
Nitpicking:Operator + =,類似於operator =和幾乎所有其中的=都應該返回一個左值。我會重寫你的操作符定義,如下所示:A&operator + =(A&,A){...}。你的其他行不會編譯,但是A()+ = A()有點違反直覺,在臨時應用+ =是無用的(更不用說符合C++編譯器不會接受它) – sbk
@sbk感謝您的反饋 - 該片段不應該是「良好」運算符重載樣式的一個例子 - 但意在表明將這些運算符(@ =)重載爲非成員函數是有效的 - 並且您對符合要求是錯誤的編譯器不接受片段以及形成的代碼 - 它在語法上是有效的 - 在語義上它是一個壞主意 - 但標準不僅沒有說重載運算符的語義應該是什麼 - 語義和良好的風格並不是我的焦點答案或OP的問題;) –
算:
+, -, *, /, %, ^, &, |, ~, !, =, <, >, +=, -=, *=, /=, %=, ^=, &=, |=, >>=, <<=, !=, <=, >=, &&, ||, ++, --, ->* , (i.e., comma operator), ->, [],(), new[], delete[]
算不能被重載:其中過載功能必須被聲明爲一個類的方法 ., .*, ::, ?:
算: (), [], ->, any assignment operator
(正如評論者注意到的)
- 1. C++運算符在已重載的運算符中重載
- 2. +運算符重載在C++
- 3. 重載[] []在C++運算符
- 4. C++:運算符重載,運算符+
- 5. 在C++中訪問重載運算符
- 6. 在C++中重載賦值運算符
- 7. 在C++中重載運算符`:=`
- 8. 運算符在C#中重載#
- 9. 在C++中重載間接運算符
- 10. 在C++中重載<<運算符?
- 11. 在c中重載++和 - 運算符#
- 12. 運算符在C++中重載
- 13. '+'運算符在C++中重載
- 14. 在C++中重載bitshift運算符
- 15. 在C++中重載運算符+
- 16. 運算符在C++中重載
- 17. 在C++中重載<<運算符
- 18. 在C++中重載比較運算符
- 19. 在C++中重載新運算符
- 20. 在c#類中重載vb.net&運算符
- 21. 運算符在Visual C++中重載?
- 22. 在C++中重載插入運算符
- 23. 運算符在C++中重載
- 24. 在C++中重載(),[]運算符
- 25. 運算符重載C++ - 重載輸出「<<」運算符
- 26. 運算符在C++幫助中重載流提取運算符
- 27. 運算符重載C++
- 28. 運算符重載C++
- 29. 運算符重載C++
- 30. C++重載運算符[]
在類上下文的意義之外,不在類內部,但仍然涉及參數中的類對象或類返回類型 –