C++笔记(四)函数

1. 函数传参方法

在调用函数时,需要将变量值传递给函数参数,即给函数参数赋值,在c++中函数参数值传递有三种方式:按值传递、引用传递、地址传递。

1.1 值传递

首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的,然后把以求出的实参表达式的值一一存入到形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用。这种传递是把实参表达式的值传送给对应的形参变量,故称这种传递方式为“按值传递”。

使用这种方式,调用函数本身不对实参进行操作,也就是说,即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。

但这种传递方式会浪费时间在副本的拷贝上,因此适用于体量不大的变量,对于数据量大的数组、结构体、类等,按值传递效率低下。

1.2 引用传参

引用传递的前提是将所有变量均看做一个对象,而引用则直接将变量对象的别名交付给函数参数,即相当于函数参数等价于变量对象的等价的别名,与变量原始名称一样,对变量拥有同等的使用权限。

如果以引用为参数,则既可以使得对形参的任何操作都能改变相应的数据,又使得函数调用显得方便、自然。引用传递方式是在函数定义时在形参前面加上引用运算符“&”。

1.3 地址传参

如果在函数定义时将形参说明成指针,对这样的函数进行调用时就需要指定地址值形式的实参。这时的参数传递方式就是地址传递方式。

地址传递与按值传递的不同在于,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。

参数地址传递也叫做指针传递,程序将指向变量的地址的指针传递给函数参数,函数参数通过指针直接对变量进行操作,这种操作直接会改变原始变量的值,与按值传递相比,这种传递方法效率更高。

void swap(int a,int b){
int c=a;
a=b;
b=c;
}

void swap(int &a,int &b){
int c=a;
a=b;
b=c;
}

void swap(int *p1,int *p2){
int c=*p1;
*p1=*p2;
*p2=c;
}

2. 函数重载

名称和返回类型相同,但参数不同。上面的void swap(int &a,int &b)void swap(int a,int b)不是重载。

3. 函数调用

进栈出栈;
函数调用时,所有局部变量都在栈中实例化,即被压入栈中。函数执行完毕时,这些局部变量都从栈中弹出,栈指针回到原来的地方。

3.1 内联函数

常规函数调用被转换成call指令,这导致栈操作,微处理器跳转到函数处执行。在函数非常简单的情况下,执行函数调用比执行函数本身的开销可能更高,这是允许将这样的函数声明为内联函数(inline),在函数调用时就展开。

#include<iostream>
using namespace std;

inline long doubleNum(int n){
	return n*2;
}

int main(){
	int x=10;
	cout<<"n's double times is "<<doubleNum(x)<<endl;
	
	return 0;
}

将函数声明为内联函数会导致代码急剧膨胀,在申明的内联函数做大量复杂操作的情况下更糟。用尽量少用。

问题

递归函数是什么,使用时要注意什么?

函数调用自己的函数称为递归函数。递归函数必须要有明确的退出条件,如果没有退出条件,递归函数可能不断调用自己,直到栈溢出后才停止,导致应用程序崩溃。

参考1
参考2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值