[c++] 参数传递

  • 实参通常是通过值传递给函数的,这意味着形参接收的只是发送给它们的值的副本,它们存储在函数的本地内存中。对形参值进行的任何更改都不会影响原始实参的值。
  • 通常,当信息被传递给一个函数时,采用按值传递的方式,这意味着形参接收的是传递给它的值的副本。如果形参的值在函数内部被改变,那么它对原始实参是没有影响的
  • 有时候可能会希望一个函数能够改变正在调用中的函数(即调用它的函数)中的一个值,这可以通过引用传递的方式来完成
  • 当使用引用变量作为形参时,它将变为实参列表中相应变量的别名,对形参进行的任何更改都将真正更改正在调用它的函数中的变量。当以这种方式将数据传递给形参时,该实参被称为按引用传递
 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 }

 注意事项:

  • 值传递时,形参会创建实参的拷贝
  • 当传递的实参为大型对象时,为了降低传值赋值实参的开销,应该将参数定义为传引用或传指针
  • 如果用返回值的话,一个函数只能返回一个值,而有时函数需要同时返回多个值,一种方法是定义一个新的数据类型包含两个成员,另一种简单的方法是用引用实参
posted @ 2019-11-27 21:46  cxc1357  阅读(166)  评论(0编辑  收藏  举报