※ 引述《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, 不过那跟本文就无关了)