相信许多人都和我也有有个疑问:
为什么c++前置自增需要引用呢?为什么有时候发现前置自增又不需要引用呢?
但是我发现博客上没有很通俗的解释,所以在这里详细解释一下:
其实很简单。
首先,引用的目的就是为了防止单纯的传值调用:函数里面的值改变了,函数外的没有变。
不用引用的情况:
Point Point :: operator++ ()//前置自增
{
_x++; _y++;
Point t(_x, _y);
return t;
}
Point Point :: operator-- ()//前置自减
{
_x--; _y--;
Point t(_x, _y);
return t;
}
这种情况下在函数内部重新生成了一个新的point类型,并且返回。
用引用的情况:
Point& Point :: operator++ ()//前置自增
{
_x++; _y++;
//Point t(_x, _y);
return *this;
}
Point& Point :: operator-- ()//前置自减
{
_x--; _y--;
//Point t(_x, _y);
return *this;
}
这种情况下并没有产生新的内存占用。直接在原有的上面修改。
而如果此时去掉引用,也就会导致:传值调用发生,这样无法修改。
PS:
对于后置自增,为什么不能引用呢?
答:因为后置自增需要延迟
因为需要延迟操作,而引用的实时改变机制也就不适用了:
Point Point:: operator++(int)//后置自增
{
Point t(_x, _y);
_x++; _y++;
return t;//先使用再增加
}
Point Point:: operator--(int)//后置自减
{
Point t(_x, _y);
_x--; _y--;
return t;//先使用再减少
}
所以后置自增必须,也只能,使用非引用方式。
而且函数内部必须定义新的数据作为返回值。