目录
第8章 函数探幽
8.1 C++内联函数(提高简单函数的效率)
8.2 引用变量
8.2.1 创建引用变量
8.2.2 将引用用作函数参数
8.2.3引用的属性和特别之处
8.2.4 将引用用于结构
8.2.5 将引用用于类对象
8.2.6 对象、继承和引用
8.2.7 何时使用引用参数
8.3 默认参数
8.4 函数重载
8.4.1 重载示例
8.4.2 何时使用函数重载
8.5 函数模板
8.5.1 重载的模板
8.5.2模板的局限性
8.5.3 显式具体化
8.5.4 实例化和具体化
8.5.5 编译器选择使用哪个函数版本
8.5.6 模板函数的发展
第8章 函数探幽
8.1 C++内联函数(提高简单函数的效率)
在函数声明和定义前加关键字 inline
E:
inline double square(double x){ return x*x;}
8.2 引用变量
引用是已定义变量的别名,
引用变量主要用作函数形参,使用引用变量做参数,函数将使用原始数据。为函数处理大型结构提供方便。
8.2.1 创建引用变量
C++使用 & 来声明引用。
int rats;
int & rodents = rats; //必须在声明引用变量时进行初始化。
8.2.2 将引用用作函数参数
8.2.3引用的属性和特别之处
尽可能使用const
8.2.4 将引用用于结构
引用主要就是为了用于结构和类。
假设一个结构struct free_throws,
可以这样编写函数原型:
void set_pc(free_throws & ft); //如果不希望修改结构,加上前缀const.
8.2.5 将引用用于类对象
C++通常使用引用将对象传递给函数
8.2.6 对象、继承和引用
基类引用可以指向派生类。
8.2.7 何时使用引用参数
使用引用的主要原因有两个:
1. 修改调用函数中的数据对象
2. 通过引用传递而不是整个数据对象,提高程序运行速度。
8.3 默认参数
默认参数指函数调用时省略实参时自动使用的默认值。
赋值给函数原型的参数即可设置默认参数。(必须从右往左添加默认值)
E: char* left(const char *str, int n=1);
8.4 函数重载
函数重载允许多个同名函数。
重载的根据是函数的参数列表。
8.4.1 重载示例
8.4.2 何时使用函数重载
仅当函数基本上执行相同的任务,但是使用不同形式的数据时,才使用函数重载。
8.5 函数模板
函数模板是通用的函数描述,也就是说,它们使用泛型来定义函数。
其中,泛型可以被具体类型替换。
E:
template <typename AnyType> //template,建立模板。
//typename 可以使用class替换
//AnyType 类型名 可以任意选择。
void Swap(AnyType &a, AnyType &b)
{
AnyType temp;
temp =a;
a =b;
b = temp;
}
8.5.1 重载的模板
模板的参数特征标不同即可重载。
8.5.2模板的局限性
可能无法处理默写类型。可以为特定类型提供具体化模板。
8.5.3 显式具体化
C++98方法:
对于给定的函数名,可以有非模板函数,模板函数和显式具体化函数以及它们的重载版本。
显示具体化的原型和定义以template<>打头,通过名称指出类型。
具体化优先于常规模板。非模板优先于模板。
8.5.4 实例化和具体化
8.5.5 编译器选择使用哪个函数版本
8.5.6 模板函数的发展
C++11新增关键字decltype
用于确定类型。
decltype(expression) var;
var与expresssion类型相同/函数返回值/...
C++11后置返回类型
double h(int x, float y)
auto h(int x, float y) ->double; //c++11后置返回类型
结合后置返回类型,可以给(模板)指定返回类型。
template<class T1,class T2>
auto gt(T1 x,T2 y) ->decltype(x +y)
{
...
return x+y;