運算子重載:成員函數與非成員函數
在運算子重載中,成員函數與非成員函數之間的選擇會造成混亂。雖然成員函數是不對稱的,非成員函數是對稱的,但為什麼在某些情況下會首選友元函數?
成員函數只能接受一個明確參數,因為 this 指標會自動傳遞來表示呼叫物件。這種不對稱性限制了與在左操作數上呼叫成員函數的情況的比較。但是,當左操作數不是類別類型時,例如嘗試將 double 與 Sample 物件進行比較,此方法會失敗。
為了解決此限制,可以使用友元函數來重載運算子。友元函數可以存取類別的私有成員,允許它們處理運算子重載而不受不對稱限制。當使用友元函數時,編譯器會將 10.0 s2 這樣的表達式轉換為運算子 (10.0, s2)。
STL 演算法偏好對稱版本,因為它們支援雙向比較,無需在運算元中明確排序。但是,應盡可能使用非成員函數以增強封裝性,因為友元函數允許存取私有成員。
總之,成員函數用於始終將類別實例作為左操作數涉及的運算符,而友元函數處理類別實例可以是任一操作數的情況。為了獲得更大的靈活性和封裝性,在不存取私有成員時應首選非成員函數。
以上是會員與非會員運算子重載:何時首選友元函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!