8.1 C++内联函数
- 在函数声明前加上关键字inline
- 在函数定义前加上关键字inline
程序员请求将函数作为内联函数时,编译器并不一定会满足这种要求。它可能认为该函数过大或注意到函数调用了自己(内联函数不能递归),因此不将其作为内联函数;而有些编译器没有启用或实现这种特性
8.2 引用变量
引用变量的主要用途时用作函数的形参,通过将引用变量用作参数,函数将使用原始数据,而不是其副本
- int & rodents = rats;
int &指的是指向int的引用,上述引用声明将rat和rodents互换–它们指向相同的值和内存单元
引用不同指针,主要差别时,必须在声明引用时将其初始化,而不能像指针那样,先声明,再赋值
-左值是什么?左值参数是可以被引用的数据对象,例如变量,数组元素,结果成员,引用和解除引用的指针。非左值包括字面常量和包含多项的表达式
- 右值引用,这种引用可指向右值,是使用&&声明,主要目的是让库涉及人员能够提供有些操作的更有效实现
使用引用参数的原因:
- 程序员能够修改调用函数中的数据对象
- 通过传递引用而不是整个数据对象,可以提高程序的运行速度
值传递,指针传递,引用传递的适用条件:
- 如果数据对象很小,如内置数据类型或小型结构,则按值传递
- 如果数据对象是数组,则使用指针,因为这是唯一的选择,并将指针声明为指向const的指针
- 如果数据对象是较大的结构,则使用const指针或const引用,来提高程序的效率,这样可以节省复制结构所需的时间和空间
- 如果数据对象是类对象,则使用const引用,类设计的语义常常要求使用引用,这是C++新增这项特性的主要原因
8.3 默认参数
必须使用函数原型。由于编译器通过查看原型来了解函数所使用的参数数目,因此函数原型也必须将可能的默认参数告知程序。方法是将值赋给原型中的参数
char * left(const char * str , int n = 1);
对于带参数列表的函数,必须从右向左添加默认值。即要为某个参数设置默认值,则必须为它右边的所有参数提供默认值
int harpo(int n, int m = 4, int j = 5);
请注意,只有原型指定了默认值,函数定于与没有默认参数时完全相同
8.4 函数重载
函数多态是C++在C语言的基础上新增的功能,函数重载的关键是函数的参数列表—也被称为函数特征标。返回类型不同无法构成重载
8.5 函数模板
函数模板允许以任意类型的方式来定义函数
template
void Snap(AnyType &a, AnyType &b)
{
}
第一行指出,要建立一个模板,并将类型命名为AnyType,关键字template和typename是必需的,另外,必须使用尖括号
函数模板不能缩短可执行程序,使用模板的好处是,它使生成多个函数定义更简单,更可靠。常见情形是,将模板放在头文件中,并在需要使用模板的文件中包含头文件
第三代具体化
- 对于给定的函数名,可以右非模板函数,模板函数和显式具体化模板函数以及它们的重载版本
- 显示具体化的原型和定义应以template<>打头,并通过名称来指出类型
- 具体化优先于常规模板,而非模板函数优于具体化和常规模板
void Swap(job &,job &);
template
void Swap(T &, T &);
template<> void Swap(job &, job &);
-编写模板函数时,一个问题是并非总能直到应在声明中使用那种类型,C++新增的关键字decltype提供了解决方案,例如
template<class T, class T>
void ft(T1 x, T2 y)
{
decltype(x+y) xpy = x + y;
}