在解决C + +中宏存取私有的类成员的问题过程中,所有和预处理器宏有关的问题也随着消失了。这是通过使宏被编译器控制来实现的。在C + +中,宏的概念是作为内联函数来实现的,而内联函数无论在任何意义上都是真正的函数。唯一不同之处是内联函数在适当时像宏一样展开,所以函数调用的开销被取消。因此,应该永远不使用宏,只使用内联函数。
任何在类中定义的函数自动地成为内联函数,但也可以使用i n l i n e关键字放在类外定义的函数前面使之成为内联函数。但为了使之有效,必须使函数体和声明结合在一起,否则,编译器将它作为普通函数对待。因此
inline int PlusOne(int x);
没有任何效果,仅仅只是声明函数(这不一定能够在稍后某个时候得到一个内联定义)。成功的方法如下:
inline int PlusOne(int x) { return ++x ;}
注意,编译器将检查函数参数列表使用是否正确,并返回值(进行必要的转换)。这些事
情是预处理器无法完成的。假如对于上面的内联函数,我们写成一个预处理器宏的话,将有不
想要的副作用。
一般应该把内联定义放在头文件里。当编译器看到这个定义时,它把函数类型(函数名+
返回值)和函数体放到符号表里。当使用函数时,编译器检查以确保调用是正确的且返回值被
正确使用,然后将函数调用替换为函数体,因而消除了开销。内联代码的确占用空间,但假如
函数较小,这实际上比为了一个普通函数调用而产生的代码(参数压栈和执行C A L L)占用的空间还少。在头文件里,内联函数默认为内部连接——即它是static, 并且只能在它被包含的编译单元看到。因而,只要它们不在相同的编译单元中声明,在内联函数和全局函数之间用同样的名字也不会在连接时产生冲突。
为了定义内联函数,通常必须在函数定义前面放一个i n l i n e关键字。但这在类内部定义内联函数时并不是必须的。任何在类内部定义的函数自动地为内联函数。如下例:
#include <iostream.h>