2.6.5 引用返回
C++(www.cppentry.com)中,在默认情况下,当函数返回一个值时:
expression被求值,并将该值拷贝到临时存储空间,以便函数调用者访问。我们将这种返回方式称为传值返回(return by value)。
例2-50
当调用如下函数
时,i的值将拷贝到临时存储空间,调用者获得的是i的一个副本,也就是说,如果调用函数val1:
则i的值将拷贝到临时存储空间,然后再拷贝到j(见图2-5)。
函数返回值还有另外一种形式,即引用返回(Return by Reference)。在这种情况下,返回值不再拷贝到临时存储空间,甚至连return语句所用的那个存储单元对调用者而言都是可访问的。引用返回的语法是在返回类型前加一个标记。
例2-51
由于函数
的返回类型为int&,因此是引用返回。当return语句执行后,调用者可以直接访问i。
例如,以如下方式调用函数val2:
则i的值直接拷贝到j中(见图2-6)。与传值返回不同的是,仅产生一个副本。
例2-52
许多程序员习惯于从1开始的数组,如下函数可以实现访问从0开始的数组的方式来访问从1开始数组的目的。该函数以i为索引访问整型数组a,其中i从1开始,通过一个减1操作,函数内部实际上以C++(www.cppentry.com)方式(即从0开始索引)访问该数组。函数返回数组元素的引用:
int&标记表明函数的返回类型是int型的引用,返回的是实际单元a[i-1],而不是其副本。可用如下方式调用函数new_index:
使用引用返回的一个好处是:如果一个函数以引用方式返回,则这个函数调用可出现在赋值语句的左边。例如,以下是对例2-52中函数new_index的一个合法调用:
上述语句执行后,-16被保存到数组a的第8个单元中。
因为使用引用返回的函数返回的是一个实际单元,必须保证函数返回时该单元仍然有效。
例2-53
函数
包含了一个错误。当f返回i时,i已经不存在了(因为i是局部变量)。因此,函数调用者不能访问传回的i。
如果改用传值返回,就没有上述错误:
此处,i的值拷贝到函数调用者可以访问的临时存储空间。