# 二. 函数
函数原型:由函数首部+分号组成 (如:int Sum (int x,int y);
)
# 1.带默认参数的函数
例:int Sum (int a=3,int b=10);
当进行函数调用时,编译器按从左向右的顺序将实参与形参结合
若没有声明函数原型,参数的默认值可在函数定义的头部进行设置。
如果在函数声明中设置了默认值,则函数定义中不能再为这些参数设置不同的默认值,否则,编译器会报错。
不过建议在声明中进行设置,这样就不用为了看哪些参数有默认值而去看函数的具体实现。
在一个指定了默认值的参数的右边,不能出现没有指定默认值的参数,即默认值只能从右到左设置
设置默认值时可以用表达式,但表达式中不能用局部变量,如:
int Sum (int a=3,int b=a);
错的
# 2.函数的参数传递
值传递
指针传递
如:
void swap (int *x,int *y){...}
swap (&a,&b);
传引用,如:
void swap(int &x,int &y)//x,y相当于a,b别名,其地址与a,b相同,最后能实现交换,swap结束后,x,y,t均被释放
{
int t;
t=x;
x=y;
y=t;
}
int main()
{
int a=3,b=4;
swap(a,b);//调用
cout<<a<<b<<endl;
}
//最后a,b的值被互换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 3.内联函数
使用inline
关键字声明一个函数,也成为内嵌函数
引入内联函数的目的是为了消除函数调用时的系统开销,以提高运行速度
格式:inline <返回值类型> <函数名> (<形参列表>)
{<函数体>}
如:
#include <iostream>
using namespace std;
double circle(double r);//声明时不加inline,在使用的地方后面定义,则需在使用的地方前面声明
int main()
{
for(int i=1;i<=3;i++)
cout<<"r="<<i<<"area="<<circle(i)<<endl;
//此处的circle(i)相当于换成了函数体内容,就不用在主函数内外来回切换
return 0;
}
inline double circle(double r)
{
return 3.14*r*r;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
注意:
- 递归函数不能被定义为内联函数
- 内联函数一般适合于不含有switch和while等复杂的结构且只有1-5条语句的小函数,否则编译系统将视为普通函数
- 内联函数只能先定义后使用,否则编译系统将视为普通函数
- 对内联函数不能进行异常接口声明
- inline只是建议编译器将函数嵌入到调用处,如果函数长度、复杂度不符合,编译器不会把它作为内联函数
# 4.重载函数
编译系统将根据函数参数的类型和个数来判断使用哪一个函数
重载函数需具有:
- 相同的函数名
- 不同的 参数个数 或 数据类型 或 类型对应顺序
注意:
- 若两个函数除了返回类型不同外,其他均相同,则是非法的
- 重载与带缺省值的函数一起使用时,有可能引起二义性
错误案例:
void A(int r=0,int b=0);
void A(int r);
A(20);//该语句对于上面两个函数均可调用,造成了二义性
1
2
3
4
2
3
4