从函数本身来说,重点掌握函数的参数、返回类型。
从函数种类来说,重点掌握内联函数、重载函数。
1.函数形参
形参分为非引用形参和引用形参。
a.非引用形参
非引用形参很简单,主要是注意有几种情况不适合使用非引用形参。
1). 类型本身不能复制或赋值,例如 IO类型
2). 实参对象本身很大,例如容器对象
3). 当需要在函数中修改参数值时
b.引用形参或指针形参
这两种形参相当于都是传递的参数本身地址,在引用形参中值得注意的是数组参数的传递,因为数组之间不能相互赋值,所以,数组只能用指针或引用的方式传递参数。
数组形参的3种形式:
1). 传递数组第一个元素的地址,并传递数组长度
一维数组:int a[5]; void fun(int* array, int length);
二维数组:int a[4][5]; void fun(int (*array)[5], int rowsize);
2). 传递数组第一个元素和最后一个元素的地址
3). 用引用传递,在用指针传递参数时,在方括号中的表示数据长度的值不起作用,但在引用中,这个值是起作用的。
例如:void fun(int* array[5]); 当传递来一个数组时,程序不会检查传递过来的数组长度是不是5,
void fun(int &array[5]);程序会检查传递过来的数组长度是否为5
c. 无论是引用形参还是非引用形参,都可以是const形参,如果形参前面有const修饰符,那么在函数中不能修改参数的值。
d. 可变函数参数
void fun(int a, ……)
f. 默认实参
在确定函数的默认实参时,最好在头文件中声明函数时就确定,那么在定义函数时不需要再指出,否则,产生重复定义编译错误。
2. 函数的返回值
在这节中,需要重点掌握的是用引用返回左指。
当返回类型为引用或指针时,不能返回局部变量的引用或地址。
int& fun(int &a[1000], int location)
{
return a[location];
}
3. 内联函数
在函数前面标注inline,此函数则为内联函数。
使用内联函数的好处是:
1). 可在头文件中定义内联函数,便于使用,维护和修改
2). 使用内联函数减少了函数调用时程序的开销。
4. 重载函数
参数类型、个数不同,但函数名称相同的函数称为重载函数。
a. 容易混淆的函数重载情况
1). 非引用形参,const形参和非const形参相同,不能认为是函数重载。
void fun(int a);
void fun(const int a);
2). 有默认实参的函数和没有默认实参的同名函数不能认为是函数重载。
void fun(int a);
void fun(int a = 10);
3). const引用形参/指针 和非const引用形参/指针 不同,是函数重载
void fun(int a);
void fun(int &a);
b.重载函数和作用域
在小作用域中如果有和大作用域中重载函数重名的函数,那么小作用域中的函数将屏蔽大作用域中的函数。
例如:
void fun(int a);
void fun(double a);
main()
{
void fun(char a);
int c = 0;
fun(c);//fun(char a)
}
c.重载函数和参数匹配
1). 选出候选函数,参数个数相同,参数类型可转换
2). 找出可精确匹配的函数,如果找不出,则进行参数类型转换。
转换原则:内置类型内部提升优先
其次,标准转换
最后,类类型转换
3)如果有2个以上函数可匹配,则产生二义性。
5.函数指针
声明: 返回类型 (*p) (参数列表)
int (*p)(double a, char b); 一个指向返回类型为int, 参数列表为double, char型的函数的函数指针。
初始化:
int fun(double a, char b);
p = fun;
p = &fun;
调用:double k = 5; char l = 'a';
p(k, l);
指向重载函数的函数指针,必须明确指明参数类型,一个函数指针只能指向重载函数中的某一个函数。