Re: [問題] 運算符號連續重載

看板C_and_CPP作者 (-6.2598534e+18f)時間9年前 (2015/09/07 07:18), 編輯推噓7(700)
留言7則, 7人參與, 最新討論串2/2 (看更多)
※ 引述《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

09/07 08:11, , 1F
09/07 08:11, 1F

09/07 09:22, , 2F
09/07 09:22, 2F

09/07 23:29, , 3F
09/07 23:29, 3F

09/08 00:40, , 4F
09/08 00:40, 4F

09/08 02:06, , 5F
09/08 02:06, 5F

09/09 11:37, , 6F
09/09 11:37, 6F

09/09 17:40, , 7F
09/09 17:40, 7F
文章代碼(AID): #1LxCcfVA (C_and_CPP)
文章代碼(AID): #1LxCcfVA (C_and_CPP)