1.下面的结果各是什么?
int i = 0;
i = i++ + 1;
Int a = 0;
a = a++ + 1;
和编译器有关,有的编译器上面输出的结果为2,++是后置++,所以i还是0,然后加1,把结果1赋值给i,i变为1,然后再执行++,所以最终i的结果为2
下面的输出的结果为1,++是我们重载的运算符,返回的值是a的旧值,也就是0,所以结果为1
2.请问下面程序输出d.value的值是多少?
Int& operator++(int)
{
static Int old = * this;
old = * this;
++* this;
return old;
}
int main()
{
Int a(10);
Int b = a++;
Int& c = a++;
c = c + 100;
Int d = a++;
}
static Int old = * this;语句只执行一次,执行完Int a(10);后a.value的值为10,执行完Int b = a++;以后,b.value的值为10,a.value的值为11,执行完Int& c = a++;以后c.value的值为11,a.value的值为12,此时c是old的引用,old的值为11,执行完c = c + 100;以后old的值为111,但是在执行Int d = a++;时,用a.value的值去赋值old,old的值变成了12,最终a.value的值为12
一般情况下不要在函数里面轻易定义静态变量,也不要轻易使用银行用返回,如果当一个函数作为引用返回时,用引用接收必须要有原因,否则不要使用引用接收,最好使用值接收
3.a = a++ + 1的解析过程
Int a = 0;
a = a++ + 1;
//a = a.operator++(0) + 1;//0用于区分调用后置++,不一定是0,只要是int类型就可以
//a = operator++(&a,0) + 1;
//a = operator++(&a,0).operator+(1);
//a = operator+(&operator++(&a,0),1);
//a.operator=(operator+(&operator++(&a,0),1));
//operator=(&a,operator+(&operator++(&a,0),1));
执行完operator=(&a,operator+(&operator++(&a,0),1));中(&operator++(&a,0)以后此时的a为1,然后拿返回的旧的对象(a为0)和1相加后的值为1,然后把相加后的结果赋值给a对象,所以a值从0变成1之后,又用1给a赋值,所