C++ Primer Plus Chapter8

Chapter8 函数进阶

函数内联

在函数声明或定义前加上关键字inline即可使用该特性

结合在编译原理实验中的实践,本人对于函数内联的理解就是编译器在编译阶段时,对于函数调用语句,不再是进行函数调用,而是将其替换为函数实际执行的功能语句块。实际执行时,实现的功能与函数调用一致,但不再需要去访问函数的内存地址了,因此可以达到加速的效果。

引用变量

创建引用变量

int rats;
int & rodents = rats;

引用必须在声明时初始化

临时变量、引用参数、const

如果实参数与引用参数不匹配,且当参数为const引用时,C++将生成临时变量。

有两种情况:

  1. 实参的类型正确,但不是左值。(左值是可被引用的数据对象,非左值包括字面常量和包含多项的表达式)
  2. 实参的类型不正确,但可以转换为正确的类型。

临时变量的生命周期仅存在于函数调用期间。

与前一章所讲到的传递指针相同,对于引用参数也应尽可能使用const,理由有三个:

  1. 使用 const 可以避免无意中修改数据的编程错误
  2. 使用 const 使函数能够处理 const 和 非 const 实参,否则只能接收非 const 实参
  3. 使用 const 引用时函数能够正确生成并使用临时变量。

右值引用

//C++11新增的另一种引用,这种引用可指向右值,使用&&声明

double && rref = std::sqrt(36.00)		//now allowed for double &
std::cout << rref << endl;

默认参数

通过函数原型设置默认值

char * left(const char * str, int n = 1);
int chico(int n, int m = 6, int j = 5);

需要注意的是必须从右向左添加默认值

函数重载

C++允许定义名称相同的函数,条件是他们的特征标不同。

需要注意的是:

  1. C++会对不符合形参的实参进行强制类型转换,如果原型中存在一个以上能够完成转换的,则不允许这样的声明。
  2. C++将类型引用和类型本身视为同一个特征标

函数模板

函数模板建立

template <typename T>
void sample(T & a, T & b) {
	//body
}

优先级

非模板函数 > 显示具体化 > 模板函数

C++11新特性

关键字 decltype

用于在函数体中对于表达式的结果类型无法确定时

template<class T1, class T2>
void ft(T1 x, T2 y) {
	decltype(x + y) xpy = x + y;
}

后置返回类型

用于对于函数返回类型无法确定时

template<class T1, class T2>
auto ft(T1 x, T2 y) -> decltype(x + y){
	return x + y;
}

参考书目C++ Primer Plus 第6版