函数返回,你真的理解了吗?
我们经常要调用函数来实现程序,然而你真的完全理解函数吗?不信,看看是否能理解下面这个函数表达式。
1 简单示例
int& fun(int& a) {
return a+=1;
}
int main() {
int i=1;
fun(i)=3;
printf("i=%d\n",i);
}
输出结果
a=3
2 分析
大多数人可能有疑问的是下面的表达式,为什么函数可以这样使用?
fun(i)=3;
首先我们得理解函数调用的结果到底是什么?
3 函数返回-本质
编译器在函数返回时,会构造一个临时变量temp。我们常说的函数返回类型就是用来指定该临时变量的类型,并且编译器会用return后的对象来初始化临时变量。所以函数的调用结果其实是一个临时对象temp。
4 回到案例-再分析
回到案例,函数fun()的调用结果表示的是一个对输入参数i的引用。fun(i) 在这里作为对象左值,于是当对fun(i)进行赋值,变量i的值也会随之改变。
再谈“左值”和“右值”
再思考一个问题,如果函数fun()的返回类型是int而不是int&,那么还可以这样赋值吗?
很明显,答案是否定的。函数fun(i)调用的结果虽然也是对象,但因为临时对象本身在表达式结束就会被释放内存,它是一个没有身份的变量(工具人),所以不能作为对象左值(只有左值才可以被赋值,解释见下面)。
下面是左值和右值的定义(参考c++primer):
当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。

浙公网安备 33010602011771号