2 jianke1989 jianke1989 于 2014.10.18 09:38 提问

刚学C++,有些关于自增运算符跟引用赋值的问题,望各位大神帮忙解答一下

#include
using namespace std;

int main() {
int a = 2;
int c = 2;
int & b = a++;
int & d = ++c;
cout<<a<<","<<b<<endl;
cout<<c<<","<<d<<endl;
}

如上面代码所示,为什么b引用的初始化会编译通不过,d引用的定义确没有提示编译错误?
按我理解
int & b = a++;应该相当于下面两句:
int & b =a;
a=a+1;
所以我觉得编译应该通得过,但实际上不行,所以请各位大神指正一下。

2个回答

u011651799
u011651799   2014.10.19 14:23

首先,你需要弄明白c++是如何实现前置自增与后置自增的。
//前置式,累加后取出

UPInt& UPInt::operator++()

{

*this+=1; //累加

return *this; //取出

}

//后置式,取出后累加

const UPInt upInt::operator++(int)

{

UPInt oldVlaue=*this; //取出

++(*this); //累加

return oldVlaue;

}

后置自增,返回的一个局部变量,之后局部变量也就不见了,把一个不存在的内存赋与引用显然不正确。而且返回的值是const,把一个const变量赋值给一个非const引用也是不正确的,在VS2008下把int & b = a++改为const int & b = a++;可以编译通过,但是在下面增加一个语句a+=1;把a与b的值打印出来,它们的值是不相同的,说明b并不是指向a的内存区域,我们可以通过打印出a与b的地址可以看出来。
前置自增与后置自增显然是不相同的,返回值是一个引用而且是它本身,这样赋值给一个引用当然是可以的。

Sounds_Of_Life
Sounds_Of_Life   2014.10.27 00:48

int &b 这是int类型b地址,,,,,a++是int类型的数据

u011651799
u011651799 把int &b = a++改为const int &b = a++,就可以编译通过,解释有点牵强。
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!