Re: [問題] 關於運算子重載(operator overloading)

看板C_and_CPP (C/C++)作者 (坐吃山空)時間11年前 (2015/05/25 08:35), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/3 (看更多)

05/25 02:08,
所以若我要讓交換律成立,我得寫兩個非成員函式?
05/25 02:08

05/25 02:09,
const complex operator*(double a, BigNumber& b)
05/25 02:09

05/25 02:09,
和const complex operator*(BigNumber& b, double a) ?
05/25 02:09
誠如原文所述,這個情況我個人想法是看 operator* 會否存取到 BigNumber 的私有成 員。如果不會的話,我會選非成員函式。如果會的話,因為這裡符合交換律我會選加 friend 的非成員函式。 所以無論如何我都會選用非成員函式的型式。 因此確實需要定義兩個函式 BigNumber operator*(double lhs, BigNumber rhs) 及 BigNumber operator*(BigNumber lhs, double rhs) [註1] 但是其中之一的實作可以由另外一個達成,例如我們已經實作好前者, 則後者可以這樣 實作: BigNumber operator*(BigNumber lhs, double rhs) { return rhs * lhs; } 當然有另一種選擇是使用隱性轉型將 double 轉為 BigNumber 來解決交換律的問題。 但是因為違反我避免使用隱性轉型的原則所以我的想法是不傾向這樣的作法。 [註1] 這裡的 signature 因為 C++ 版本不同有不同適當的寫法。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.122.83.198 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1432514105.A.A33.html

05/25 16:30, , 1F
感謝,受教了!
05/25 16:30, 1F
文章代碼(AID): #1LOcuvep (C_and_CPP)
文章代碼(AID): #1LOcuvep (C_and_CPP)