簡體   English   中英

重載Operator =作為成員函數

[英]Overloading Operator = as a member function

C ++允許重載=運算符僅作為成員函數而不是全局函數。

Bruce Eckel說if it was possible to define operator= globally, then you might attempt to redefine the built-in = sign. 並且由於這個原因,你可以將overload = operator僅作為成員函數。

如果C ++已經定義了=運算符,那么為什么其他運算符如+ - etc ...不是由C ++定義的,因為它們可以作為非成員函數重載。

編譯器為所有未定義自己的類生成默認的復制賦值運算符(operator =)。 這意味着在任何情況下都不會選擇全局過載。

=運算符(當用作初始化時)與構造函數緊密相關; 當你編寫SomeClass a = b; 調用SomeClass一些構造函數。

因為賦值對任何類型都有明確的含義,其他運算符則沒有。

看起來很難從類外部實現operator =()而不需要引用特定的實現和私有成員。

然而,像'+'這樣的運營商有時必須在全球范圍內定義。 考慮一個復數類。 我可以在我的類中定義complex :: operator +(float),但是我必須從外部定義operator +(float,complex),因為第一個操作數沒有我的類的類型。

編輯 :我還應該提到,通過使用類中定義的其他運算符,通常很容易定義像operator +這樣的全局運算符,而無需參考特定的實現細節。 例如:

complex operator+(float lhs, complex rhs) {return complex(lhs, 0)+rhs;}

為了擴大@ ildjarn的評論,全球內置的語義=被普遍設置; 在使用某種rvalue初始化類的新實例時調用它,並調用相應的構造函數(基於rvalue的編譯時類型),這是提供c樣式初始化而不是嚴格的好方法要求通過顯式調用構造函數來初始化所有變量。 重載全局運算符會改變語言的基本語義,同時提供很少的知識真正的好處 - 你將從根本上改變如何調用構造函數,調用構造函數,以及如果你覺得你有理由通過重載全局=做到這一點,你錯了很有可能。

類成員operator=是可重載的,因為它在其類的已存在且已初始化的左值上運行,並且在很明顯的情況下,您需要自定義行為來修改預先存在的對象(例如僅從右值復制某些成員)重新計算其他人,讓其他人獨自離開,或者妥善處理指針所占用的資源,以便在不泄漏記憶的情況下掌握新資源。

在成員operator=處理一個完整的左值對象的情況下,內置的東西只是一個適當大小的內存塊和一個右值。 所有形狀和形式的構造函數都是語言提供的接口,用於修改內置=的行為,而不會將語義本身控制給您。 我有興趣看看你認為你需要通過重載global =來完成你無法用構造函數完成的事情。

暫無
暫無

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

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