5.C++函数新特性
内联函数、按引用传递变量、默认的参数值、函数重载(多态)、模板函数
5.1 内联函数的声明和定义都要在函数前面加上inline。内联函数不能递归。
内联函数在编译的时候,直接将代码写在调用它的函数中。(C语言的宏)
5.2 引用
必须在声明引用变量时进行初始化。
返回引用的函数实际上是被引用的变量的别名。
数据对象小,按值传递。
数组,用指针
类对象,用引用
大型结构体,用指针或者对象
5.3 默认参数
int harpo(int n, int m=4, intj=5)
h=harpo(2); 则h=harpo(2,4,5);
h=harpo(2,8); 则h=harpo(2,8,5);
h=harpo(2,8,6); 则h=harpo(2,8,6);
有默认参数,没有赋值时,按照默认参数来;有赋值,则使用参数覆盖。
好处:减少定义的析构函数、方法、方法重载。
注意:只有原型指定了默认值。函数定义与没有默认参数时完全相同。
原型:
char * left(const char *str, int n=1);
定义:
char * left(const char * str,int n)
{
……
}
5.4 函数重载(多态)
函数的参数,类型引用和类型本身视为同一特征标。
5.5 函数模板
template <typenameT> 或者template <class T>
实例化与具体化
template <class T>
void swap(T &, T &);
template <> void swap<job>(job &, job &); //显式具体化
int main()
{
template voidswap<char>(char &, char &); //显式实例化
short a,b;
…
swap(a,b); //隐式实例化,用模板生成函数
job n,m;
…
swap(n,m); //显式具体化
char g,h;
…
swap(g,h); //显式实例化
}
声明类型的两种特殊关键字 decltype和auto
int x;
decltype(x) y; //定义了与x相同类型的y
auto y=x; //定义了与x相同类型的y并赋值。
两者的结合使用:
template <class T1, classT2>
auto gt(T1 x, T2 y) ->decltype(x+y)
{
…
return x+y;
}
函数gt()返回类型未知,使用auto作为返回类型,后置指定返回类型是x+y。decltype(x+y)不能作为返回类型,因为x,y都没有定义,放在后面,x,y已经定义了。
6.头文件管理
在同一个文件中,只能包含一个头文件一次。可能将一个头文件包含多次的情况:可能使用了包含了另外一个头文件的头文件。
例如:
头文件myfile2.h包含#include “myfile1.h”,头文件myfile3.h包含了“myfile1.h”“myfile2.h”,那么,头文件myfile3.h就包含了myfile1.h两次了。
解决办法是每个头文件都使用#ifndef处理器编译指令:
如在头文件1中
#ifndef MYFILE1_H_
#define MYFILE1_H_
… //头文件中的内容部分
#endif
在头文件myfile2.h中,第一次包含了myfile1.h,就#define MYFILE1_H_,到myfile.3要包含myfile1.h时,先判断MYFILE1_H_有没有被定义,发现已经定义了,就不在包含myfile1.h里面的内容。