转载请注明出处:http://blog.youkuaiyun.com/enyusmile/article/details/46605337
本章内容包括:
- 内联函数
- 应用变量
- 如何按引用传递函数参数
- 默认参数
- 函数重载
- 函数模板
- 函数模板具体化
8.1 C++内联函数
- 常规函数和内联函数之间的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中.
- 内联函数的编译代码与其他程序代码”内联”起来了.编译器将使用相应的函数代码替换函数调用.内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存.所以应该有选择的使用内联函数.
- 要是用这项特性,必须采取下述措施之一:
- 在函数声明前加上关键字inline
- 在函数定义前加上关键字inline
- 通常的做法是省略原型,将整个定义(即函数头和所有函数代码)放在本应提供原型的地方.
- 程序员请求将函数作为内联函数时,(有些)编译器不一定会满足这种要求.过大或调用自己,内联函数不能递归.
- 程序清单8.1 inline.cpp
- 尽管程序没有提供独立的原型,但C++原型特性仍在起作用.这是因为在函数首次使用前出现的整个函数定义充当了原型.
- 内联与宏:inline工具是C++新增的特性.C语言使用预处理器语句#define来提供宏–内联代码的原始实现.宏不能按值传递.需要指出的是,如果使用C语言的宏执行了类似函数的功能,应考虑将他们转换为C++内联函数.
8.2 引用变量
- 引用变量的主要用途是用作函数的形参.通过将引用变量用作参数,函数将使用原始数据,而不是其副本.
8.2.1 创建引用变量
- C和C++使用&符号来指示变量的地址.C++给&符号赋予了另一个含义,将其用来声明引用.
int rats;
int & reodents = rats;
- 程序清单8.2 firstref.cpp
- 注意:必须在声明引用变量时进行初始化.
- 引用更接近const指针,必须在创建时进行初始化,一旦与某个变量关联起来,就将一直效忠于它.
- 程序清单8.3 sceref.cpp
8.2.2 将引用用作函数参数
- 程序清单8.4 swaps.cpp
8.2.3 引用的属性和特别之处
- 程序清单8.5 cubes.cpp
- 如果程序员的意图是让函数使用传递给它的信息,而不对这些信息进行修改,同时又想使用引用,则应使用常量引用.如果这样做,当编译器发现代码修改了方法里的值时,将生成错误消息.
- 临时变量,应用参数和const:如果实参与引用参数不匹配,C++将生成临时变量.
- 如果引用参数是const,则编译器将在下面两种情况下生成临时变量:
- 实参的类型正确,但不是左值;
- 实参的类型不正确,但可以转换为正确的类型.
- 如果接受引用参数的函数和意图是修改作为参数传递的变量,则创建临时变量将阻止这种意图的实现.解决方法是,禁止创建临时变量,现在的C++标准正是这样做的(然而,在默认情况下,有些编译器仍将发出警告,而不是错误消息,因此如果看到了有关临时变量的警告,请不要忽略).
- 注意:如果函数调用的参数不是左值或与相应的const引用参数的类型不匹配,则C++将创建类型正确的匿名变量,将函数调用的参数的值传递给该匿名变量,并让参数来引用该变量.
- 应尽可能使用const:将引用参数声明为常量数据的引用的理由有三个:
- 使用const可以避免无意中修改数据的编程错误.
- 使用const使函数能够处理const和非const实参,否则将只能接受非const数据.
- 使用const引用使函数能够正确生成并使用临时变量.
- C++11新增了另一种引用—右值引用.这种引用可指向右值,是使用&&声明的.主要目的是,让库设计人员能够提供有些操作的更有效实现.以前的引用(使用&声明的引用)现在称为左值引用.
8.2.4 将引用用于结构
- 程序清单8.6 strt_ref.cpp
- 程序说明
- 为何要返回引用
- 注意:返回引用的函数实际上是被引用的变量的别名.
- 返回引用时需要注意的问题
- 应避免返回函数终止时不再存在的内存单元引用.
- 为何将const用于引用返回类型
8.2.5 将引用用于类对象
- 将类对象传递给函数时,C++通常的做法是使用引用.
- 程序清单8.7 strquote.cpp
8.2.6 对象,继承和引用
- 程序清单 filefunct.cpp