一、 形参与实参
1. 形式参数(简称形参):定义函数时,函数名后面括号中的变量名。由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。
eg:当你定义函数void add(int a, int b)的时候,这里的a和b就是形参。(注意:函数定义不能在主函数中。)
2. 实际参数(简称实参):调用函数时,函数名后面括号中的表达式。是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
eg:当你调用函数add(1 ,2)的时候,这里的1和2就是实参。
注:
1. 实参必须有确定的值;
2. 形参必须指定类型;
3. 形参和实参类型一致,个数相同;
4. 若形参与实参类型不一致,自动按形参类型转换;eg:一个形参需要double类型数据,实参给了int类型数据,int会自动转化成double。如果实参没法转化成实参类型,则会报错;
5. 形参在函数被调用前不占内存,在函数被调用时才分配形参的存储单元,调用结束后,内存释放。
例1:若有下面的函数调用:fun(a+b,3,max(n-1,b)),则fun的实参个数是( )
A.3 B . 4 C . 5 D . 6
答案:A
解析:C++中函数调用的一般形式为:函数名(实参表),其中实参表是用逗号分隔的一系列表达式。fun()函数的实参表由实参a+b、3和max(n-1,b)组成,实参个数为3个。
简单来说,实参以逗号隔开,上题有两个逗号,所以有三个实参。
二、 参数传递方式
有两种:值传递和引用传递。
1. 值传递:单向传递,形参只是得到实参的值,它和实参是两个不同的对象,不会互相影响,改变形参,不影响实参。
例:
1 #include<iostream> 2 using namespace std; 3 void Swap(int, int); 4 5 int main() 6 { 7 int a = 1, b = 2; 8 cout << "a的值为:" << a << "b的值为:" <<b<<endl; 9 Swap(a, b); 10 cout << "a的值为:" << a << "b的值为:" <<b<<endl; 11 } 12 13 void Swap(int x, int y) 14 { 15 int temp; 16 temp = x; 17 x = y; 18 y = temp; 19 cout << "Swap函数中a的值为:" << x << "Swap函数中b的值为:" << y << endl; 20 }
运行结果:
从上面可以看出,主函数声明了两个全局变量a,b并对其赋值1,2;通过函数Swp()函数调用之后,在函数内部将a和b的值交换了,使得函数内,a=2,b=1;但是,这个过程并没有改变全局变量a和b的值。
分析:
函数Swap()被调用前,实参a和b有自己的存储空间,并且有自己的初始值。当调用函数Swap()时,为形参(即函数的参数)x和y分配存储空间,并将a和b的值复制过来,函数执行过程中,将x和y的值进行交换,当函数执行结束之后,x和y所占用的存储空间将被释放,这种传递的方式,并不会对实参a和b的值产生影响,此即为值传递。
例2:在下列原型所示的C++函数中,按“传值”方式传递参数的是( )
A. Void f1(int x); B.void f2(int *x); C.void f3(const int *x); D.void f4(int &x);
答案:A
解析:函数参数的3种传递方式:①将变量名作为形参和实参,即传值方式;②传递变量指针;③引用形参。其中B、C选项都是传递变量指针,D选项为引用形参,所以本题答案为A。
2. 引用传递:双向传递,形参是实参的引用。也就是可以认为形参和实参是同一个对象,你在函数中对形参的修改也会影响外部的实参。(常引用作参数可以保障实参数据的安全性。)
例:
1 #include<iostream> 2 using namespace std; 3 void Swap(int&, int&); 4 5 int main() 6 { 7 int a = 1, b = 2; 8 cout << "a的值为:" << a << "b的值为:" <<b<<endl; 9 Swap(a, b); 10 cout << "a的值为:" << a << "b的值为:" <<b<<endl; 11 } 12 13 void Swap(int &x, int &y) 14 { 15 int temp; 16 temp = x; 17 x = y; 18 y = temp; 19 cout << "Swap函数中a的值为:" << x << "Swap函数中b的值为:" << y << endl; 20 }
运行结果:
当函数未调用之前,实参a和b的值分别为1和2。当函数调用过程中,形参的值被交换,即a=2,b=1;函数调用结束之后,实参的值被改变。即函数调用时,作为形参的引用变量并不分配新的内存空间,它将作为实参变量的别名与其共用内存。
说明:
使用引用参数可以直接操作实参变量,从而能够实现通过修改形参的值而达到修改对应实参值得目的。当引用作为函数形参,其引用的目标变量没人为调用该函数时对应的实参变量名,所以,在定义函数时,对于引用类型参数不必提供引用的初始值。