看板 C_and_CPP 關於我們 聯絡資訊
問題(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
Caesar08: 排版+問題描述 08/18 15:40
※ 編輯: orafrank (61.216.95.223), 08/18/2016 15:43:20 ※ 編輯: orafrank (61.216.95.223), 08/18/2016 15:44:52
shadow0326: google prefix and postfix operator overloading 08/18 15:55
Caesar08: 我覺得關鍵在於為甚麼這樣會通過編譯 08/18 15:58
Caesar08: 阿 沒事,我搞錯了 08/18 15:59
bluesoul: obj++ 相當於 obj++(0) 08/18 16:23
※ 編輯: orafrank (61.216.95.223), 08/18/2016 16:43:27
LPH66: 這就只是語言規定這樣子分前置和後置運算子 08/18 16:54
LPH66: 後置運算子會當做還有一個 int 參數, 實際在呼叫時 08/18 16:56
LPH66: 編譯器會塞一個 0 進去; 多一個參數的原因是因為重載是函式 08/18 16:57
LPH66: 需要使用函式的 overload resolution, 故加 int 參數區分之 08/18 16:57
Qoofate: 看懂了 C++真麻煩 = = 08/21 10:09