2009-09-19 88 views
2

除'new','delete','< <'&'>>'運算符外,還有哪些其他運算符可以在類上下文之外的C++中重載?可重載(用作定界符逗號)運算符在C++中重載

+1

在類上下文的意義之外,不在類內部,但仍然涉及參數中的類對象或類返回類型 –

回答

4

下面的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款的標準涵蓋了這一點。

希望這會有所幫助。

+0

Nitpicking:Operator + =,類似於operator =和幾乎所有其中的=都應該返回一個左值。我會重寫你的操作符定義,如下所示:A&operator + =(A&,A){...}。你的其他行不會編譯,但是A()+ = A()有點違反直覺,在臨時應用+ =是無用的(更不用說符合C++編譯器不會接受它) – sbk

+0

@sbk感謝您的反饋 - 該片段不應該是「良好」運算符重載樣式的一個例子 - 但意在表明將這些運算符(@ =)重載爲非成員函數是有效的 - 並且您對符合要求是錯誤的編譯器不接受片段以及形成的代碼 - 它在語法上是有效的 - 在語義上它是一個壞主意 - 但標準不僅沒有說重載運算符的語義應該是什麼 - 語義和良好的風格並不是我的焦點答案或OP的問題;) –

4

算:

+, -, *, /, %, ^, &, |, ~, !, =, <, >, +=, -=, *=, /=, %=, ^=, &=, |=, >>=, <<=, !=, <=, >=, &&, ||, ++, --, ->* , (i.e., comma operator), ->, [],(), new[], delete[]

算不能被重載:其中過載功能必須被聲明爲一個類的方法 ., .*, ::, ?:

算: (), [], ->, any assignment operator (正如評論者注意到的)

+0

感謝您的快速響應,但問題明確要求哪些類可以在類之外重載 –

+0

@muralive:他們都是? – peterchen

+0

例如,不要嘗試在類之外重載operator ++。 –