带默认值的函数
调用带参数的函数要赋给它实际参数值,而有些时候参数值大多时候都是一样的,这时调用时不断赋一样的参数值显得很累赘。
在c++中允许在定义或声明时为参数指定默认值。当调用函数时,没有为它指定参数值时,系统会将默认值赋值给形式参数。
例如函数声明如下:
void print(int value int base=10);
调用时可省略第二个参数:print(x);
使用时应注意:
1.设计函数原型时,应把带有默认值的参数放在参数表的右边,函数调用时,编译器依次将实际参数传给形式参数,没有得到实际参数的形式参数取它的默认值。调用函数时,至少要有一个实际参数。一旦某个参数指定了默认值,后面的参数都必须有默认值。
void f(int a,int b=1,int c,int d=1)
是错误的使用情况。
2.最好在函数声明处指定默认值。
3.在不同源文件中,可以对函数的参数指定不同的默认值。
内联函数
内联函数有函数的外表,但没有调用的开销。编译时编译器将内联函数的代码直接复制到调用处来避免函数调用所需的时间。代价是目标代码变长。所以内联函数只适用于较小的函数。
要定义内联函数,只需在函数类型前加上关键字inline。
inline int square(int x)
{return x*x;}
在使用内联函数时,内联函数要定义在被调用之前,否则编译器不知道该插入什么代码。
重载函数
在C语言中不允许出现同名函数,当编写一组功能类似的函数时必须给它们取不同的函数名,例如一个程序要找出一组数据的最大值,这组数据的数据个数不一定,就需要写多个针对不同数据的函数。
c++提供了重载函数的功能。允许参数个数类型不同的函数取得相同函数名,这组函数叫做重载函数。
例如:求一组数据的最大值的一组函数就可以取名为max,用户不用知道这组数据有做多少条就可以直接调用max。
函数声明:
int max(int a1,int a2);
int max(int a1,int a2,int a3);
...```
然后在不同参数个数的函数体中实现相应功能即可。
重载函数虽然为用户提供了方便,但给编译器带来了麻烦。编译器要确定到底调用的是哪个函数,进行对函数的绑定过程。
>函数模板
重载函数方便了用户,函数模板方便了程序员。
所谓的函数模板就是把函数中某些形式参数的类型设计成可变的参数,适用于参数类型不同,程序逻辑相同的情况。
函数模板的定义:
template <calss T>
T max(T a,T b)
{ return a>b?a:b; }```
函数调用时编译器根据实参的类型确定模板参数的值,将实参类型取代模板函数的类型参数,形成一个真正可执行的函数。这一过程称作模板的实例化,实例化后的函数称作模板函数。
特殊情况:模板的形式参数没有全部都出现,编译器不知道该给没出现的参数对应的模板参数赋值,这是可以通过显示指定模板实参的方式来解决,也就是直接告诉编译器模板实参是什么,例:
函数模板:
template <class T1,class T2,class T3>
T3 clac(T1 x,T2 y)
{ return x+y;}
函数调用:
clac<int,char,int>(5,a");
结果为102
网友评论