C++函数引用传递(超详细)
前面讲过,实参通常是通过值传递给函数的,这意味着形参接收的只是发送给它们的值的副本,它们存储在函数的本地内存中。对形参值进行的任何更改都不会影响原始实参的值。
然而,有时候可能会希望一个函数能够改变正在调用中的函数(即调用它的函数)中的一个值,这可以通过引用传递的方式来完成。
我们知道,变量是可以保存数据的内存位置的名称。当使用变量时,实际上就是访问存储在分配给它的内存位置的数据。引用变量是变量的另一个别名,它没有自己的存储数据的内存位置,它访问的是另一个变量的内存位置。对引用变量作出的任何更改,实际上都是对它所引用的变量内存位置中存储数据的更改。
当使用引用变量作为形参时,它将变为实参列表中相应变量的别名,对形参进行的任何更改都将真正更改正在调用它的函数中的变量。当以这种方式将数据传递给形参时,该实参被称为按引用传递。
引用变量的定义方法和常规变量类似,但是其数据类型和名称之间有一个 &
符号。例如,以下函数定义使形参 refVar 成为引用变量:
void doubleNum(int& refVar) { refVar *= 2; }
注意,变量 refVar 被称为“对 int 的引用”。
该函数将 refVar 乘以 2,因为 refVar 是引用变量,所以该操作实际上将对作为实参传递给函数的变量执行。
具有引用形参的函数的原型也必须具有 &
符号。与函数头一样,它在数据类型和变量名之间。如果原型中省略了变量名,那么 &
符号将跟在数据类型后面。以下所有 doubleNum 函数的原型都是正确的:
void doubleNum(int &refVar);
void doubleNum(int& refVar);
void doubleNum(int &);
void doubleNum(int&);
注意,&
符号必须出现在使用引用变量作为形参的任何函数的原型和函数头中。它不会出现在函数调用中。
下面的程序演示了引用变量形参的应用:
#include <iostream> using namespace std; // Function prototype. The parameter is a reference variable. void doubleNum(int SrefVar); int main() { int value = 4; cout << "In main, value is " << value << endl; cout << "Now calling doubleNum..." << endl; doubleNum(value); cout << "Now back in main, value is "<< value << endl; return 0; } void doubleNum (int SrefVar) { refVar *= 2; }
程序输出结果:
In main, value is 4
Now calling doubleNum...
Now back in main, value is 8
此程序中的形参 refVar “指向”函数 main 中的 value 变量。当程序使用一个引用变量时,它实际上是使用它所引用或指向的变量,如图 1 所示。
发表评论