※ 引述《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 該怎麼做呢
: http://ppt.cc/Sa3Y 關於 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, 不過那跟本文就無關了)