(1) 内联函数是C++为提高程序运行速度所做的一项改进。
(2) 内联函数的编译代码与其他程序代码“内联”起来了,也就是说,编译器将使用相应的函数代码替代函数调用。
(3) 内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存。比如,如果程序在10个不同地方调用同一个内联函数,则该程序将包含该函数代码的10个副本。
(4) 使用内联函数这项特性,必须在函数声明前加上关键字inline或在函数定义前加上关键字inline。但通常的做法是将整个定义放在本应提供原型的地方。(在函数首次使用前出现的整个函数定义充当了原型。)
(5) 程序员请求将函数作为内联函数时,编译器并不一定会满足这种要求,它可能认为该函数过大或注意到函数调用了自己。
(6) 内联函数这种特性,在C语言中存在类似的特性,C语言使用预处理器语句#define来提供宏(宏,是内联代码的原始实现。)。内联和宏的区别:宏只是通过文本替换来实现,所以,不能实现按值传递;而内联可以按值传递。
如下宏:
#define SQUARE(X) (X)*(X)
调用:a = SQUARE(5.0); b =SQUARE(4.5+7.5); d = SQUARE(c++);//会将c递增两次。
引用变量
C++新增了一种复合类型,引用变量。引用是已定义的变量的别名(另一个名称)。
(1) 引用变量的主要用途是用作函数的形参。通过将引用变量用作参数,函数将使用原始数据,而不是其副本。因此,除指针之外,引用也为函数处理大型结构提供了一种非常方便的途径。
(2) 就像声明中的char*指的是指向char的指针一样,int&指的是指向int的引用。
int rats;
int& rodents = rats;
int& doo = redents;
上述三个rats、rodents和doo可以互换使用,因为它们指向相同的值和内存单元。如果通过取地址符&对三者操作,它们的地址是一样的。
(3) 必须在声明引用时将其初始化,而不能像指针那样,先声明,再赋值。于是,引用更接近const指针,必须在创建时进行初始化,一旦与某个变量关联起来,就将一直效忠于它。
int& rodents = rats;
int * const pr = &rats;
其中,引用rodents扮演的角色与表达式*pr相同。
(4) 引用作为函数参数应该注意的地方:
a. 比如,double x = 3.0;
函数原型 double refcube(double &ra);
函数调用 double z =refcube(x + 3.0);
在有些较老的编译器会勉强通过,但会发出警告。在较老的编译器是这样对待的:程序创建一个double类型的临时无名变量,它的值是表达式x+3.0的值,然后,ra将成为该临时变量的引用。
在现代C++中,上述调用时错误的,通过不了编译。原因是表达式x+3.0并不是变量,例如,不能对表达式赋值,如:x+3.0 = 5.0 。也就是说,它不是左值。
b. 当且仅当函数参数为const引用时,当实参与引用参数不匹配但可以转换为正确的类型,或者实参与引用参数匹配但不是左值,C++允许生成临时变量。
c. 实际上,对于形参为const引用的C++函数,如果实参不匹配,则其行为类似于按值传递(确保原始数据不被修改,将使用临时变量来存储值)。