参数传递
形参的类型决定了形参和实参的交互方式。
如果形参是引用类型, 它将绑定到对应的实参上 (传引用参数); 否则, 将实参的值拷贝后赋给形参(传值参数)。
传值参数
传值参数有2种方式:
将实参的实际值复制给函数的形参。 在这种情况下,修改函数内的形参对实参没有影响。
将参数的地址复制给形参(指针)。 因为指针使我们可以见间接地访问它所指的对象, 所以通过指针可以修改它所指对象的值。
#include<iostream>
#include<string>
using namespace std;
int reset(int i);
void reset1(int *pi);
int main()
{
int num = 10;
cout << "reset : " << reset(num) << endl;
cout << "num: " << num << endl;
cout << "num的地址: " << &num << endl;
reset1(&num);
cout << "reset1 : " << num << endl;
cout << "num的地址: " << &num << endl;
return 0;
}
//传递实参的实际值,将实参的值拷贝给形参,函数体中修改的是形参的值,对实参不产生影响
int reset(int i)
{
i *= 2;
return i;
}
//传递实参的地址,修改*pi的值,就是修改实参指向的对象的值。修改pi的值,是修改的形参存储的地址,不影响实参的地址。
void reset1(int *pi)
{
*pi *= 2;
pi = 0;
}
传引用参数
引用: 引用是已定义的变量的别名。 对于引用的操作实际上是作用在引用所引的对象上的。 它们共用相同的内存空间。
传引用参数: 通过将引用变量用作参数, 函数将使用原始数据, 而不是其副本。
int n = 0;
int &r = n;(&不再是地址运算符, r是n的引用)
用途:
当某种类型不支持拷贝操作, 或是需要拷贝的对象太大时, 我们可以通过引用形参来访问对象。
当函数需要同时返回多个值时, 可以使用引用形参来处理。
#include<iostream>
#include<string>
using namespace std;
void reset(int &i);
int min(int num1, int num2, int num3, int &max);
int main()
{
int num = 10;
reset(num);
cout << num << endl;
int maxNum;
int minNum;
minNum = min(20, 15, 23, maxNum);
cout << "最大值为:" << maxNum << endl;
cout << "最小值为:" << minNum << endl;
return 0;
}
//将引用变量作为参数,函数使用的是原始数据,而不是副本。
//对形参的修改其实就是对实参的修改。
void reset(int &i)
{
i = i * 2;
}
//函数的返回值为int类型,返回的是3个数中的最小值
//定义了一个引用类型的参数,通过这个参数修改maxNum的值,获得最大值
int min(int num1, int num2, int num3, int &max)
{
int temp1, temp2;
temp1 = num1 < num2 ? num1 : num2;
temp1 = temp1 < num3 ? temp1 : num3;
temp2 = num1 > num2 ? num1 : num2;
temp2 = temp2 > num3 ? temp2 : num3;
max = temp2;
return temp1;
}