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

    评论

报告相同问题?

悬赏问题

  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)