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