在C#中,重載任何運算符的方法(函數)必須是static
和public
。C++運算符重載
我看到,使它成爲一件好事,每個對象都不需要它自己的版本。
但是在C++中,它不一定是static
。爲什麼C#強制執行此操作而C++不執行?
這兩種設計的優缺點是什麼?
在C#中,重載任何運算符的方法(函數)必須是static
和public
。C++運算符重載
我看到,使它成爲一件好事,每個對象都不需要它自己的版本。
但是在C++中,它不一定是static
。爲什麼C#強制執行此操作而C++不執行?
這兩種設計的優缺點是什麼?
爲什麼C++不強制運算符重載是「靜態」?
如果您使重載的運算符功能爲靜態,它將無法訪問this
。在重載函數中需要訪問this
,因爲通常該函數會改變this
的狀態。
如果您不需要訪問該函數內的this
,則可以創建一個重載的運算符函數static
,這基本上意味着您不操縱調用操作符函數的對象的狀態。所以它是可以選擇的,但不是通常或基本上需要。
使全局重載的運算符函數static將限制運算符函數的作用域爲同一個文件。
鑑於上述兩種,編譯器不執行重載操作功能是因爲執行將提供沒有真正的優點或方便,而不是執行相同的提供更多的便利靜態的。
爲什麼C#強制運算符重載是 「靜態」?
This解釋它比我更好。
有哪些優勢和劣勢?
好了,回答的第一個問題不說出來的時候一個能有這樣的解釋的優點/ disdvantage一個重載的操作符的功能的靜態&。
我重建了我的問題。 – Sherif 2011-05-13 08:06:10
爲什麼C#實施重載操作符爲
static
?
我不是C#的設計師之一。一個潛在的原因是C++的經驗表明,運算符的參數之間存在不對稱(這是成員二元運算符的直接後果)是一個壞主意。
爲什麼C++不強制重載操作符爲
static
?
因爲以前沒有經驗可以繼續開發,這似乎是一個好主意嗎? (這個區別在Algol68中是沒有意義的,它是少數幾種早於C++的語言之一,它具有運算符重載.BTW C++沒有重複運算符重載中的Algol68錯誤。)
對不起,我不明白這部分「運營商的論點之間的不對稱(這是成員二元運營商的直接後果)是一個壞主意」。 – Sherif 2011-05-13 19:27:36
@mavric,通常你會期望運算符是可交換的,即+ b等於b + a。如果一個論點是特殊的(一個成員稱爲對象),語言規則使得交換性難以實現。例如在C++中,隱式轉換將不可用。 – AProgrammer 2011-05-13 19:46:36
所以你是這樣說的:編譯器強制它是靜態的,以強制每個運算符重載方法都應該返回一個值,而不僅僅是它的對象數據? – Sherif 2011-05-14 17:01:28
我認爲C#強制執行它,因爲它更好理解,而不是它會是錯誤的。
添加2個對象時,我很難理解this
參數,所以我認爲他們強制執行它以降低複雜性,但運算符非靜態仍然沒有問題,只是更容易理解。
因爲它們是不同的語言。我不是很瞭解C#,所以我不能對 評論太多,但在C++中,一些運營商,如[]
和()
, (更不用說複製分配運算符)不能是靜態的,對於 各種原因。一般來說,你爲什麼要運營商是靜態的 ?我不認爲我曾經在C++中創建過靜態運算符。經典的二元算術運算符通常是自由函數,並且是所有其他運算符成員。 (人們可以認爲無論是operator++
更好 成爲會員或免費的功能,但最寬 傳播的做法似乎是讓他們的成員。)
的操作符重載可以在C++靜態。 – 2011-05-13 07:33:53
即使運算符不是靜態的,它也不會認爲每個對象都有自己的*代碼* – 2011-05-13 07:34:56
@Neil:我沒有說它不能是「靜態」,我只是問爲什麼編譯器不會像C#那樣使其成爲「靜態」。 – Sherif 2011-05-13 07:36:34