C++函数提供很多新特性使之有别于C:
内联函数,按引用传递变量,默认的参数值,函数重载(多态)以及模板函数。
内联函数与常规函数的区别不在于编写方式,而在于编译器如何将其组合到程序中。
常规的函数调用时程序从当前地址(主调函数运行处)跳转到新地址(被调函数地址)执行北调函数,执行完毕再跳转回来。
具体:
存储(主调函数中)调用被调函数的这条指令的内存地址;
将函数的参数存储到指定的堆栈中;
调到标记函数起点的内存单元;
执行函数代码;
将返回值写入寄存器;
跳回到地址被保存的指令处,即第一步中存储的内存地址处。
来回跳跃并记录跳跃位置需要一定的开销。
内联函数:编译器使用相应的函数代码(即内联函数的内容)替换函数调用,所以无需跳跃执行。因此执行速度更快,但是需要占用的内存更多。
要使用内联函数,则必须在函数声明或者函数定义前面加上关键字inline。
与内联函数不同,C中的宏是纯粹的文本替换而非值传递:
inline square(double x){returen x*x;}
#define SQUARE(x) x*x
后者是在SQUARE出现的地方,将其替换为x*x。
区别在于square(1+2) = 9,而SQUARE(1+2)=1+2*1+2=5.
可以进一步改进为#define SQUARE(x) (x)*(x),即使是这样,宏也不是值传递:SQUARE(x++)仍然是做两次自加。
所以可以考虑在C++中将宏替换成内联函数。
引用:
引用的主要作用是作为函数的形参使用,使用引用做参数,函数传递的是原始数据而不是拷贝,即变量和变量的引用表示的是同一内存地址。
必须在声明时初始化且一旦与某个变量关联起来就会一直效忠于该变量(因为非初始化语句中的=都是赋值操作,而不是给引用变量重定向),这就类似于const指针,即必须在声明时初始化,又必须终生指向某个特定的变量。
int a;
int * const pr = &a;
int & c=a;
将引用作为参数传递称为按引用传递,其允许被调函数访问主调函数中的变量,进而使得主调函数能保留被调函数中对变量所做的修改。
指针类型也可以有引用。
当数据比较大(如结构和类)时,引用参数将很有用。
应尽量使用const引用做形参(void rcde(const doule& t)),理由如下:
1,避免无意中造成的修改数据的错误;
2,使用const使得函数既能够处理const实参又能处理非const实参;
3,使用const引用能使函数正确生成并使用临时变量,如,int a=3; rcde(a)以及rcde(a+3);也是对的,他是在rcde函数中首先生成一个double型的临时变量并存储数据类型转变后的a的值,然后使得t引用该临时变量。如果,是void rcde2(doule& t),当int a=3; rcde2(a);或者rede2(a+3)时则直接错误。