[问题] ++重载的观念

楼主: orafrank (法兰克 )   2016-08-18 15:38:47
问题(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);
作者: Caesar08 (Caesar)   2016-08-18 15:40:00
排版+问题描述
作者: shadow0326 (非议)   2016-08-18 15:55:00
google prefix and postfix operator overloading
作者: Caesar08 (Caesar)   2016-08-18 15:58:00
我觉得关键在于为什么这样会通过编译阿 没事,我搞错了
楼主: orafrank (法兰克 )   2016-08-18 16:13:00
作者: bluesoul (忙死你老爸)   2016-08-18 16:23:00
obj++ 相当于 obj++(0)
作者: LPH66 (-6.2598534e+18f)   2016-08-18 16:54:00
这就只是语言规定这样子分前置和后置运算子后置运算子会当做还有一个 int 参数, 实际在呼叫时编译器会塞一个 0 进去; 多一个参数的原因是因为重载是函式需要使用函式的 overload resolution, 故加 int 参数区分之
作者: Qoofate (大鲁阁_最强打者)   2016-08-21 10:09:00
看懂了 C++真麻烦 = =

Links booklink

Contact Us: admin [ a t ] ucptt.com