Chapter8 函数进阶
函数内联
在函数声明或定义前加上关键字inline即可使用该特性
结合在编译原理实验中的实践,本人对于函数内联的理解就是编译器在编译阶段时,对于函数调用语句,不再是进行函数调用,而是将其替换为函数实际执行的功能语句块。实际执行时,实现的功能与函数调用一致,但不再需要去访问函数的内存地址了,因此可以达到加速的效果。
引用变量
创建引用变量
int rats;
int & rodents = rats;
引用必须在声明时初始化
临时变量、引用参数、const
如果实参数与引用参数不匹配,且当参数为const引用时,C++将生成临时变量。
有两种情况:
- 实参的类型正确,但不是左值。(左值是可被引用的数据对象,非左值包括字面常量和包含多项的表达式)
- 实参的类型不正确,但可以转换为正确的类型。
临时变量的生命周期仅存在于函数调用期间。
与前一章所讲到的传递指针相同,对于引用参数也应尽可能使用const,理由有三个:
- 使用 const 可以避免无意中修改数据的编程错误
- 使用 const 使函数能够处理 const 和 非 const 实参,否则只能接收非 const 实参
- 使用 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++允许定义名称相同的函数,条件是他们的特征标不同。
需要注意的是:
- C++会对不符合形参的实参进行强制类型转换,如果原型中存在一个以上能够完成转换的,则不允许这样的声明。
- 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版
PREVIOUSC++ Primer Plus Chapter7