jianke1989 2014-10-18 01:38 采纳率: 0%
浏览 1846

刚学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条回答 默认 最新

  • l_d_d_ 2014-10-19 06: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的地址可以看出来。
    前置自增与后置自增显然是不相同的,返回值是一个引用而且是它本身,这样赋值给一个引用当然是可以的。

    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大