※ 引述《LPH66 (1597463007)》之銘言:
: ※ 引述《putumaxally (putumaxally)》之銘言:
: : 問題(Question):overload operator 不能使用 pointer 當參數嗎?
: : 上週在 C 語言的課堂上被老師問 pointer 跟 reference 的差別,我在
: : 網路上找資料的時候看到這段程式碼
: : enum day
: : {
: : Sunday, Monday, Tuesday, Wednesday, Thursady, Friday, Saturday
: : }x;
: : day& operator++(day& d)
: : {
: : d = (day)(d + 1);
: : return d;
: : }
: : 不可以改成 day* operator++(day* d) 的形式
: : 只有當參數是 T, T& 才是 member operator 嗎,所以 T* 一定不會用在
: : operator overloading 嗎?
: : 還有上面的例子是 prefix 的,那如果想要 postfix 該怎麼做呢
: :
![]()
關於 pointer 跟 reference 的差別,我這樣描述對嗎?
: 其實上面這個不是 member operator...
: member operator 是在 class 當中直接寫 operator xxx
: 例如
: class BigNumber
: {
: // ...
: public:
: BigNumber& operator ++ (); // member operator prefix ++
: BigNumber operator ++ (int); // member operator postfix ++
: };
: enum 由於無法宣告 member function 所以不會有 member operator
: 因此只能用這個樣子寫在外面
: 同樣不得不寫在外面的狀況是 operator 的左邊是 primitive type
: 或是 operator 的左邊那個 class 你動不到
: 例如我前面推文提到的 std::string 的例子
: 在 std::string 這個 class 裡有個 member operator == 是吃 const char * 的
: 概念上像是這樣:
: class string
: {
: // ...
: public:
: bool operator == (const char *rhs) const;
: };
: 這使得我們可以寫 someStringObject == "someCString"
: 它就會去呼叫這個 member operator
: 實際上它會視為 someStringObject.operator == ("someCString") 進行呼叫
: 但是 "someCString" == someStringObject 卻不一樣了
: 因為左邊是 primitive type 無法對它定義 member
: 所以只好寫一個在 string 外面的 operator 它會長成像這樣:
: bool operator == (const char *lhs, const string &rhs);
: 這樣一來 "someCString" == someStringObject 這句話
: 就會被視為 operator == ("someCString", someObject) 來進行呼叫
: enum 的狀況由於無法定義 member function 只好用寫在外面的那種方式來定義
: 另一種要寫在外面的狀況的例子像是
: ostream& operator << (ostream& out, const BigNumber& num);
: 由於 std::ostream 我們動不到 所以只好寫一個在外面的 operator
: 這樣一來 cout << someBigNumber
: 就會當成 operator << (cout, someBigNumber) 而呼叫到這個函式
: (寫在外面的 operator 其實還有一個 issue 是 namespace, 不過那跟本文就無關了)
: