8.1 C++内联函数
编译过程的最终产品是可执行程序(由机器语言指令组成),与操作系统有关,每条指令都由指定的内存地址,计算机逐条执行,有时需要跳过一些指令(if,for),向前向后跳到特定地址。常规函数调用也是程序跳到函数的地址,并在函数调用结束后返回,而内联函数,程序无需跳到另一个地址,编译器将使用相应的函数代码替换函数调用。
内联函数的运行速度比常规函数快,但需要占用更多内存。
使用规则:
- 在函数声明前加上关键字inline;
- 在函数定义前加上关键字inline。
内联函数不能递归(调用自己)
内联函数与宏函数的机制不同,内联函数是通过传递参数实现的,而宏函数则是通过文本替换实现的。
8.2 引用变量
8.2.1 创建引用变量
C++使用&来声明引用变量
rodents作为rats的别名,rodents引用变量,允许两个变量进行互换,也就是他们指向相同的值和内存单元。
引用变量必须在声明时进行初始化,而指针可以先声明再赋值,引用变量更像const指针,一旦与某个变量关联起来,就不会更改地址。
8.2.2 将引用变量用作函数参数
引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量的别名。
这种引用传递就不需要再创建实参副本了,直接就可以将值传递给主函数中的原变量。
8.2.3 引用的属性和特别之处
引用变量与实参有关,当实参类型正确但不是左值(可被引用的数据对象);实参的类型不正确,但可以转换为正确的类型,这些情况都会生成临时变量。
8.2.4 将引用变量用于结构
引入引用变量可以直接修改结构中的值
不能返回函数中声明的变量
8.2.5 将引用用于类对象
8.2.6 对象、继承和引用
继承:将特性从一个类(基类)传递到另一个类(派生类),另一个类拥有类这个类的方法。
基类引用可以指向派生类对象而无需进行强制类型转换,因此,可以定义一个接受基类引用作为参数的函数,调用该函数时,可以将基类对象作为参数,也可以将派生类对象作为参数。
8.2.7 何时使用引用参数
8.3 默认参数
默认参数是指当函数调用中省略了实参时自动使用的一个值。
8.4 函数重载
函数重载是指可以有多个同名的函数,类似于一个词有不同的状态(动词、名词),编译器将根据所采取的用法使用有相应特征标(相同参数列表)的原型。
仅当函数基本上执行相同任务,但使用不同形式的数据时,才应采用函数重载。
8.5 函数模版
函数模版使用泛型来定义函数,其中的泛型可用具体的类型替换。通过将类型作为参数传递给模版,可使编译器生成该类型的函数。
分别为非模版、模版、模版具体化
编译器使用模版为特定类型生成函数定义时,得到的是模版实例。(隐式实例化)
显示实例化
显示具体化
显示实例化的函数模版可以用于定义其他类型,显示具体化的函数模版不能定义其他类型。
编译器选择函数版本: