概念:
函数的 参数传递 指的是形参与实参结合的过程,其基本方式包括值传递和引用传递两种。
理解形参和实参:
在定义函数时,参数是没有实际值的,只起一个占位作用,所以称为形式参数,简称 "形参";在调用函数时,参数必须有一个确定的值,是真正能对结果起作用的因素,所以称为实际参数,简称 "实参"。
值传递:
该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。例如新建 swapxy.cpp
,输入:
#include<iostream>
using namespace std;
void swap(int a,int b){ //定义空函数 swap,用于交换 a 和 b 的值。
int t=a; //定义中间变量 t,并将 a 的值赋给变量 t。
a=b; //将 b 的值赋给 a。
b=t; //将 t 的值赋给 b,又因为 t=a,所以把 a 的值赋给 b。
}
int main(){
int x=3;
int y=4;
cout<<"x="<<x<<","<<"y="<<y<<endl; //输出 x、y。
swap(x,y); // 调用 swap 函数。
cout<<"x="<<x<<","<<"y="<<y<<endl; //输出调用函数后 x、y 的值。
}
调用已经定义好的函数 swap,但函数调用时传递的是实参的值,即单向传递过程,此时改变形参的值对实参无任何影响。
程序结果:
引用传递:
使用引用传递,需要在定义函数时,在参数前加上符号 &
,该方法把参数的引用复制给形式参数,修改形式参数会影响实际参数。例如修改 swapxy.cpp
文件为以下内容:
#include<iostream>
using namespace std;
void swap(int &a,int &b){ //定义空函数 swap,用于交换 a 和 b 的值。
int t=a; //定义中间变量 t,并将 a 的值赋给变量 t。
a=b; //将 b 的值赋给 a。
b=t; //将 t 的值赋给 b,又因为 t=a,所以把 a 的值赋给 b。
}
int main(){
int x=3;
int y=4;
cout<<"x="<<x<<","<<"y="<<y<<endl; //输出 x、y。
swap(x,y); // 调用 swap 函数。
cout<<"x="<<x<<","<<"y="<<y<<endl; //输出调用函数后 x 和 y 的值。
}
函数 swap 的形参属于引用类型,所以修改形参将影响实参。
程序运行结果:
拓展(默认参数):
在 C++ 中,函数可定义具有默认值的参数,即 默认参数。当调用函数时,如果用户指定了参数值,则使用用户指定的值;如果参数值缺省,则使用默认参数。例如新建 defaultcs.cpp
,输入:
#include<iostream>
using namespace std;
int add(int a,int b = 5){//变量 b 的值默认为 5。
return a + b;
}
int main()
{
int a,b;
cout<<"input a b:"<<endl;
cin>>a>>b;
cout<<"a + b(default) = "<<add(a)<<endl; //此时调用的 add 函数将 b 的值缺省,使之为默认参数。
cout<<"a + b = "<<add(a,b)<<endl;
return 0;
}
add(a)
的返回结果为:输入的 a 值与默认 b 值之和。
add(a,b)
的返回结果为:输入的 a 值与输入的 b 值之和。
程序结果为:
函数重载:
函数重载 指定义一个参数类型或参数个数不同的重名函数。当程序执行时,编译器将调用参数类型与函数形参类型一致的函数。例如新建 renamehs.cpp
,输入:
#include<iostream>
using namespace std;
int add(int a,int b){ //定义整型函数 add。
int c;
c = a - b;
return c;
}
double add(double a,double b){ //定义双精度型函数 add。
double c;
c = a + b;
return c;
}
int main()
{//函数重载。
cout<<"a + b = "<<add(3,4)<<endl;//调用整型函数 add。
cout<<"a + b = "<<add(3.111,4.222)<<endl;//调用双精度型函数 add。
}
执行 add(3,4)
时,调用 int add(int a,int b)
函数。
执行 add(3.111,4.222)
时,调用 double add(double a,double b)
函数。
程序结果: