- 实参通常是通过值传递给函数的,这意味着形参接收的只是发送给它们的值的副本,它们存储在函数的本地内存中。对形参值进行的任何更改都不会影响原始实参的值。
- 通常,当信息被传递给一个函数时,采用按值传递的方式,这意味着形参接收的是传递给它的值的副本。如果形参的值在函数内部被改变,那么它对原始实参是没有影响的
- 有时候可能会希望一个函数能够改变正在调用中的函数(即调用它的函数)中的一个值,这可以通过引用传递的方式来完成
- 当使用引用变量作为形参时,它将变为实参列表中相应变量的别名,对形参进行的任何更改都将真正更改正在调用它的函数中的变量。当以这种方式将数据传递给形参时,该实参被称为按引用传递
1 #include <iostream> 2 using namespace std; 3 // Function prototype. The parameter is a reference variable. 4 void doubleNum(int &SrefVar); 5 int main() 6 { 7 int value = 4; 8 cout << "In main, value is " << value << endl; 9 cout << "Now calling doubleNum..." << endl; 10 doubleNum(value); 11 cout << "Now back in main, value is "<< value << endl; 12 return 0; 13 } 14 void doubleNum (int &SrefVar) 15 { 16 SrefVar *= 2; 17 }
- 通过返回值改变实参的值
1 #include <iostream> 2 using namespace std; 3 //Function prototypes 4 void getNum(int &); 5 int doubleNum(int); 6 int main() 7 { 8 int value; 9 // Call getNum to get a number and store it in value 10 getNum(value); 11 value = doubleNum(value); 12 // Display the resulting number 13 cout << "That value doubled is " << value << endl; 14 return 0; 15 } 16 void getNum(int &userNum) 17 { 18 cout << "Enter a number: "; 19 cin >> userNum; 20 } 21 int doubleNum (int number) 22 { 23 return number *2; 24 }
- 引用变量其实就是原始变量的别名,该原始变量用作实参。这样的设计使得函数可以访问原始实参变量,从而允许它更改变量的内容
- 应该仅在绝对需要时才使用引用变量。任何时候允许一个函数来改变函数之外的变量,其实都是在创建潜在的调试问题
- 按引用传递实参还有一种替代方法,那就是使用指针作为函数参数
1 #include <iostream> 2 using namespace std; 3 //Function prototypes 4 void getNumber(int *); 5 void doubleValue(int *); 6 int main() 7 { 8 int number; 9 //Call getNumber and pass the address of number 10 getNumber(&number); 11 // Call doubleValue and pass the address of number 12 doubleValue(&number); 13 // Display the value in number 14 cout << "That value doubled is " << number << endl; 15 return 0; 16 } 17 void getNumber(int *input) 18 { 19 cout << "Enter an integer number: "; 20 cin >> *input; 21 } 22 void doubleValue(int *val) 23 { 24 *val *= 2; 25 }
注意事项:
- 值传递时,形参会创建实参的拷贝
- 当传递的实参为大型对象时,为了降低传值赋值实参的开销,应该将参数定义为传引用或传指针
- 如果用返回值的话,一个函数只能返回一个值,而有时函数需要同时返回多个值,一种方法是定义一个新的数据类型包含两个成员,另一种简单的方法是用引用实参