簡體   English   中英

為什么重載復合賦值運算符可以是非成員函數?

[英]Why can overloaded compound assignment operators be non-member functions?

我剛剛發現復合賦值運算符(例如operator+=operator-= )可以在類范圍之外重載。

考慮:

class X { }; // A third party class

// The following function is legal:
X& operator+=(X& lhs, const X& rhs) {
    // ...
}

顯然,非成員函數不能觸及X的私有接口,因此這里沒有封裝問題。 但它確實使它看起來好像它是X自己界面的一部分,顯然它不是。

在我看來,這可能導致一些嚴重的代碼濫用和混亂的行為。 想象一下,有人認為將它用於標准包含的一些“聰明的黑客”會更好,例如std::vectorstd::map

這是特別奇怪的,因為其他運算符如operator[]operator->不能成為我認為是這個原因的非成員函數。

那么為什么允許呢?

那么為什么允許呢?

你要求我們閱讀Stroustrop的思想。 不可能。
但是C ++的一般原則並不是限制開發人員(我們不提供一套可以安全使用的絕對工具。我們提供全套剃刀鋸和旋轉連枷)。

在我看來,這可能導致一些嚴重的代碼濫用和混亂的行為。 想象一下,有人認為將它用於標准包含的一些“聰明的黑客”會更好,例如std :: vector或std :: map。

是的,它可以。
當你濫用運算符重載時,它可能導致一些危險和致命的事情。 最好不要這樣做(特別是對其他人或標准班)。

但它可以提供一些潛在的有用情況(當你小心的時候)。 這在構建數字“類型”類時特別有用,因為它有助於自動轉換,使代碼更自然。

考慮庫A是否定義了一個對象(比如說一個Matrix對象)。 庫B擴展了庫A,其中包含一些類似的對象(比如說Vector)。

庫B想要定義將矩陣鏈接到向量的運算符(例如,乘法)。 但是如果定義這些運算符重載必須在原始對象中完成,則編寫器將被卡住,並且用戶將處於奇怪的情況,他們可以執行向量*矩陣,但不能執行矩陣*向量。

如你所述,特別注意+ =和 - =,考慮1乘n矩陣,它本質上是一個向量。 我們現在希望能夠執行矩陣+ =向量。

允許在外部定義它們可以避免此問題。

在我看來,這可能導致一些嚴重的代碼濫用和混亂的行為

非常正確。 但是不要忘記這是一種內置預處理器的語言。 如果其他開發人員想讓您感到困惑,他們已經擁有了更強大的工具。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM