作者LPH66 (-6.2598534e+18f)
看板C_and_CPP
標題Re: [問題] 運算符號連續重載
時間Mon Sep 7 07:17:58 2015
※ 引述《dinex (我不要成為廢文王)》之銘言:
: class MyInt {
: int nVal;
: public:
: MyInt(int n) { nVal = n; }
: int ReturnVal() { return nVal; }
: int operator - (const int & operand){
: nVal=nVal-operand;
: return nVal;
: }
: };
1. 先回答你的問題: 讓你的函數回傳自己這個 MyInt
(還是不知道的話下面連結可以參考)
2. 你想做的事情類似 Method chaining
不過這種事情一般不會覆載運算子
而會直接寫一個普通的成員函式來做
詳細可看
https://en.wikipedia.org/wiki/Method_chaining
以這例就會變成像是 a.decrement(1).decrement(2).decrement(3);
3. 就算要覆載運算子
這種會改變左邊運算元狀態的運算一般會用帶 = 的指定運算子
以此例基本上就是會覆載 operator -= 來達成
這樣你的使用也會是 a-=1; 這樣直覺
4. 但帶 = 的運算子的結合是右結合
這代表 a-=b-=c; 會是 a-=(b-=c);
因此你還是不能寫 a-=1-=2-=3; 來達成你想做的事
必須要括號起來變成 ((a-=1)-=2)-=3; 才行
5. 如果你想做的不是改變 a 而是回傳一個值
首先 operator - 依然要回傳 MyInt
然後你還得覆載 operator =
這樣你才能寫 MyInt b; b=a-1-2-3;
6. 說實在的, 就算不看 MyInt
單寫 a-1-2-3; 就想有用一定是有什麼地方弄錯了
你看對一個普通的 int a; 寫 a-1-2-3; 也是什麼事都沒有
也是要寫 ((a-=1)-=2)-=3; 才會有用
這就是 operator - 跟 operator -= 的語義不同所在
7. 所以你最好再次思考你想做的到底是 - 還是 -= 還是什麼其他的
再思考這東西要不要串, 能不能串, 串起來又是什麼意思
最後才來思考你要怎麼寫能串的東西
--
LPH [acronym]
= Let Program Heal us
-- New Uncyclopedian Dictionary, Minmei Publishing Co.
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.39.85
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1441581481.A.7CA.html
推 BlazarArc: 推 09/07 08:11
推 bibo9901: 推 09/07 09:22
推 astralbeams: 推 09/07 23:29
推 xvid: 推 09/08 00:40
推 yoco: 堆 09/08 02:06
推 s1000: 錐 09/09 11:37
推 yichen: 推 09/09 17:40