C++ 函数之形参、传递方式及其本质
什么是形参
形参,顾名思义,就是形式上的参数,这个参数并没有实际的具体含义,进一步讲,就是没有具体的值。如定义一个函数:
void add(int a)
{
a = a + 2;
}
其中,参数a并没有具体的含义,只知道它是一个int类型的参数,这就是形参。
传递方式
当调用函数时,有三种向函数传递参数的方式:
传递方式 | 说明 |
---|---|
值传递 | 把实参赋值给形参,修改形参不影响实参。 |
引用传递 | 形参相当于实参的别名,修改形参相当于修改实参 |
指针传递 | 直接对指针操作,修改形参相当于修改实参 |
默认情况下,函数采用值传递的方式进行传递。
//定义三个函数,分别用值传递、引用传递、指针传递
void add(int a)
{
a = a + 2;
}
void subtract(int& a)
{
a = a - 2;
}
void multiply (int* a) //形参a为指向int类型的指针
{
*a = *a * 2; //形参a前的*为解引用符,2前的*为乘号
}
分别调用三个函数:
main()
{
int num = 7;
add(num);
std::cout << num << std::endl; //num值不发生变化,7 == num
subtract(num);
std::cout << num << std::endl; //num值不发生变化,5 == num
multiply (&num)
std::cout << num << std::endl; //num值不发生变化,10 == num
}
深度剖析:
add(int a)采用值传递的方式,在函数执行前,把实参num复制给形参a,由形参类型的复制构造函数完成。如果实参与形参类型不一致,实参必须进行类型转换,与形参类型保持一致。函数运行结束时,调用形参类型的析构函数释放形参参数。当函数运行结束时,形参并不会赋值到对应的实参中,所以实参的值并不会改变。
subtract(int& a)采用引用传递方式,实参num相当于形参a的别名,即在函数执行期间,num替代了a,形参a并没有调用复制构造函数和析构函数。所以,理论上讲,引用传递比值传递效率更快。