1.函数的递归调用
函数直接或间接的调用自身叫做递归调用。例如汉诺塔问题,可以用递归来解决。
#include<iostream>
using namespace std;
void hanoi(int n,char A,char B,char C){
if (n==1)
cout<<A<<"-->"<<C<<endl;
else{
hanoi(n-1,A,C,B);
cout<<A<<"-->"<<C<<endl;
hanoi(n-1,B,A,C);
}
}
2.函数的参数传递
- 传值
void swap(int a,int b){……};
; - 传引用
void swap(int &a,int &b){……};
;引用是一种特殊类型的变量。
int i,j;
int &ri=i;//从此,ri相当于i的一个别名
j=10;
ri=j;//相当于对i进行了赋值
3.内联函数
内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。inline double calArea(double redius){……};
,内联函数的特点:
- 不能有循环语句、switch语句;
- 其定义必须出现在内联函数第一次调用之前;
- 不能进行异常接口声明。
4.带默认形参值的函数
特点:
- 有默认值的形参必须在形参列表的最后,
int add(int x,int y=0,int z=1);
正确,int add(int x=2,int y=1,int z);
错误; - 在相同作用域内,不允许在同一个函数的多个声明中对同一个参数的默认值重复定义,即使前后定义的值相同也不行。例如:
int add(int x=1,int y=2){
cout<<x+y;
}
int add(int x=1,int y=2);
- 如果一个函数在定义之前已有原型声明,那么默认形参值需要在声明时给出,定义中不能再出现默认形参值,例如:
int add(int x=1,int y=2);
int main(){
……
}
int add(int x=1,int y=2){
……
}
5.函数重载
在程序中,一个函数就是一个操作的名字,两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器在编译时不会报错,它会根据调用时,实参和形参的类型及个数进行匹配,自动确定调用哪一个函数,这就是函数的重载。注意:
- 函数重载不以形参名区分;
- 不以返回值区分。
C++系统函数
调用函数之前必须加以声明,系统函数的原型声明已经全部由系统提供并分类保存在不同的头文件中。程序员需要做的事情就是用Include指令,在代码中嵌入相应的头文件,以便使用系统函数,例如include <cmath>
。