2011-08-23 92 views
9

我的C++老師認爲標準C++中的*運算符「已經過載」,因爲它可能意味着間接或乘法取決於上下文。C++ *運算符是否「已經超載?」

實際上,許多C++(和C)運營商已經在超負荷:他從C++的Primer Plus,其中指出了這一點。例如,*運算符應用於地址時,會生成存儲在該地址的值。但是,將*應用於兩個數字會得到這些值的乘積。 C++使用操作數的數量和類型來決定採取哪種操作。 (第502頁,第5版)

至少有一本其他教科書說的差不多。據我所知,這不是事實;一元*是與二進制*不同的運算符,編譯器消除歧義的機制與運算符重載無關。

誰是對的?

+3

你是對的。從某種意義上說,公平地說,內建的運營商已經根據他們的觀點採取了多態的行爲。這是靜態多態性 – sehe

+7

請注意,除了存在兩個'*'運算符(在英語意義上「超載」而不是在C++意義上),內建二進制'*'實際上也在C++意義上被重載,它適用於不同的類型 - 「int」,「double」等 - 具有不同的效果。用於操作員重載分辨率的一組有效過載在標準中定義爲13.6/12。同樣,對於每個指針類型(13.6/6)和函數指針類型(/ 7),一元'*'都有效地被重載。 –

回答

12

兩者都是正確的,因爲問題取決於上下文和單詞重載的含義。

「重載」可以具有「相同符號,不同含義」的通用含義,並允許「*」的所有用途,包括間接和乘法以及任何用戶定義的行爲。

「重載」可用於應用於C++的官方操作符重載功能,在這種情況下,間接和乘法確實是不同的。

附錄:請參見下面史蒂夫的評論,在 「操作overoading」 versues 「令牌超載」。

+15

所以即使術語「重載」也是超負荷的。 –

+7

準確地說,我認爲前者的含義是重載的'*'標記,而不是'*'運算符。雖然這是一個非常好的頭髮,但我認爲這是令牌,因爲使用一元'*'的表達式的語法不同於使用二進制'*'的表達式的語法。你可以想象,它們都變成了'operator *(...)',一個參數爲一元,二個爲二進制,在這種情況下,它的行爲就像一個名爲'operator *'的重載函數。這只是標準算法表達式的標準。 –

+1

@Steve我完全同意並喜歡這種精確度。我會對我的答案。 :) –

2

我相信你是。解除運算和mult。 op是不同的操作符,即使寫入相同。 +, - ,++, - 和其他我可能已經忘記的其他東西也一樣。

我相信在這一段中,這本書將「重載」一詞稱爲「以多種方式使用」,但不是由用戶使用。所以你也可以認爲這本書是正確的......也取決於是否指的是*運算符或乘法運算符的重載(例如)。

1

由於相同的字符用於表示不同地方的不同事物(例如指針取消引用,在int之間的乘法,與其他內置類型的乘法等等),所以它是過載的。

一般,不過,「操作符重載」指的是定義操作員(即具有相同的符號作爲內置一)使用自定義代碼以便它做一些事情了用戶定義類型有趣。

所以......你們都是對的:-)