[問題] ++重載的觀念

看板C_and_CPP作者 (法蘭克 )時間7年前 (2016/08/18 15:38), 7年前編輯推噓4(407)
留言11則, 6人參與, 最新討論串1/1
問題(Question): class ADD{ friend ADD operator++(ADD op); friend ADD operator++(ADD &op,int n); public: ADD(int i=0,int j=0) {a=i;b=j;} void show() const{cout << "a=" << a << ",b=" << b << endl;} private: int a,b; }; ADD operator++(ADD op) { ++op.a; ++op.b; cout << "++1 \r\n"; return op;} ADD operator++(ADD &op,int n){ ++op.a; ++op.b; cout << "++2 \r\n"; return op;} int main(int argc, char **argv) { ADD obj(1,2); obj.show(); (obj++).show(); obj.show(); (++obj).show(); obj.show(); } 餵入的資料(Input): 預期的正確結果(Expected Output): a=1,b=2 a=2,b=3 a=2,b=3 a=3,b=4 a=2,b=3 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): 關鍵在於 (obj++).show(); 會呼叫ADD operator++(ADD &op,int n) (++obj).show() 呼叫 ADD operator++(ADD op) 為什麼哩? 網路上查的資料 class Object { //... public: Object operator++(); Object operator++(int); } obj; //... ++obj; //is equivalent to obj.operator++(); obj++; //is equivalent to obj.operator++(0); -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.95.223 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1471505931.A.0EC.html ※ 編輯: orafrank (61.216.95.223), 08/18/2016 15:40:47

08/18 15:40, , 1F
排版+問題描述
08/18 15:40, 1F
※ 編輯: orafrank (61.216.95.223), 08/18/2016 15:43:20 ※ 編輯: orafrank (61.216.95.223), 08/18/2016 15:44:52

08/18 15:55, , 2F
google prefix and postfix operator overloading
08/18 15:55, 2F

08/18 15:58, , 3F
我覺得關鍵在於為甚麼這樣會通過編譯
08/18 15:58, 3F

08/18 15:59, , 4F
阿 沒事,我搞錯了
08/18 15:59, 4F

08/18 16:23, , 6F
obj++ 相當於 obj++(0)
08/18 16:23, 6F
※ 編輯: orafrank (61.216.95.223), 08/18/2016 16:43:27

08/18 16:54, , 7F
這就只是語言規定這樣子分前置和後置運算子
08/18 16:54, 7F

08/18 16:56, , 8F
後置運算子會當做還有一個 int 參數, 實際在呼叫時
08/18 16:56, 8F

08/18 16:57, , 9F
編譯器會塞一個 0 進去; 多一個參數的原因是因為重載是函式
08/18 16:57, 9F

08/18 16:57, , 10F
需要使用函式的 overload resolution, 故加 int 參數區分之
08/18 16:57, 10F

08/21 10:09, , 11F
看懂了 C++真麻煩 = =
08/21 10:09, 11F
文章代碼(AID): #1NjMOB3i (C_and_CPP)