3 回答

TA貢獻1844條經驗 獲得超8個贊
C ++中運算符重載的三個基本規則
當談到C ++中的運算符重載時,您應該遵循三個基本規則。與所有此類規則一樣,確實存在例外情況。有時人們偏離了他們,結果并不是糟糕的代碼,但這種積極的偏差很少。至少,我所看到的100個這樣的偏差中有99個是沒有道理的。但是,它可能只有1000中的999。所以你最好堅持以下規則。
只要操作員的意義不明顯且無可爭議,就不應該超載。 相反,提供具有良好選擇名稱的功能。
基本上,重載運營商的第一個也是最重要的規則是:不要這樣做。這可能看起來很奇怪,因為有很多關于運算符重載的知識,因此很多文章,書籍章節和其他文本都涉及到這一切。但盡管有這些看似明顯的證據,但只有極少數情況下運營商超載是合適的。原因是實際上很難理解運算符應用背后的語義,除非在應用程序域中使用運算符是眾所周知且無可爭議的。與普遍看法相反,情況并非如此。始終堅持運營商眾所周知的語義。
C ++對重載運算符的語義沒有限制。您的編譯器將很樂意接受實現二元+
運算符的代碼從其右操作數中減去。然而,這樣的運營商的用戶將不會懷疑表達a + b
減去a
從b
。當然,這假設應用程序域中的運算符的語義是無可爭議的。始終提供一系列相關操作。
運營商彼此之間以及與其他運營相關。如果您的類型支持a + b
,用戶也可以打電話a += b
。如果它支持前綴增量++a
,它們也a++
可以工作。如果他們可以檢查是否a < b
,他們肯定也希望能夠檢查是否a > b
。如果他們可以復制構造您的類型,他們希望分配也可以工作。

TA貢獻1780條經驗 獲得超5個贊
C ++中運算符重載的通用語法
您無法在C ++中更改內置類型的運算符的含義,只能為用戶定義的類型1重載運算符。也就是說,至少一個操作數必須是用戶定義的類型。與其他重載函數一樣,運算符只能為一組參數重載一次。
并非所有運算符都可以在C ++中重載。在無法重載的運算符中有:.
::
sizeof
typeid
.*
和C ++中唯一的三元運算符,?:
可以在C ++中重載的運算符包括:
算術運算符:
+
-
*
/
%
和+=
-=
*=
/=
%=
(所有二進制中綴);+
-
(一元前綴);++
--
(一元前綴和后綴)位操作:
&
|
^
<<
>>
和&=
|=
^=
<<=
>>=
(所有二進制中綴);~
(一元前綴)boolean algebra :(
==
!=
<
>
<=
>=
||
&&
所有二進制中綴);!
(一元前綴)內存管理:
new
new[]
delete
delete[]
隱式轉換運算符
miscellany :(
=
[]
->
->*
,
所有二進制中綴);*
&
(所有一元前綴)()
(函數調用,n-ary中綴)
但是,你可以超載所有這些并不意味著你應該這樣做。請參閱運算符重載的基本規則。
在C ++中,運算符以具有特殊名稱的函數形式重載。為具有其他功能,重載操作符可以通常被實現為一個其左操作數的類型的成員函數或作為非成員函數。您是否可以自由選擇或限制使用其中任何一個取決于幾個標準。2應用于對象x的一元運算符@
3可以作為operator@(x)
或作為調用x.operator@()
。二元綴運算符@
,施加到對象x
和y
被稱為或者作為operator@(x,y)
或作為x.operator@(y)
。4
實現為非成員函數的運算符有時是其操作數類型的朋友。
1 “用戶定義”一詞可能略有誤導。C ++區分內置類型和用戶定義類型。前者屬于例如int,char和double;后者屬于所有struct,class,union和enum類型,包括來自標準庫的類型,即使它們不是由用戶定義的。
2 這是覆蓋在后面的部分這個常見問題。
3 這@
不是C ++中的有效運算符,這就是我將其用作占位符的原因。
4 C ++中唯一的三元運算符不能重載,唯一的n-ary運算符必須始終作為成員函數實現。
- 3 回答
- 0 關注
- 1080 瀏覽
添加回答
舉報