C++拾遗(七)函数相关(2)

时间:2024-11-02 23:35:19

内联函数

内联函数与常规函数的区别在于:

1.常规函数:在执行调用指令时,先存储该指令的内存地址,将函数参数复制到堆栈,然后跳转到被调用函数起点的内存单元,执行函数,将返回值放      入寄存器,最后跳回到一开始被保存的指令处。

2.内联函数:编译器将函数调用替换为函数代码,不需要跳转,但是内存开销大。

PS:内联函数不能递归,内联函数的函数体不能过大。使用时在声明和定义的前面都要加上关键字 inline。

引用传值

当函数的参数为const引用时,编译器将在以下两种情况生成临时变量:

1.实参类型不匹配,但是可以转换为正确类型。

2.实参类型匹配,但不是左值。

使用临时变量时,行为与按值传递类似,原始数据不修改而使用临时变量。

PS:基类的引用可以指向派生类对象。

默认参数

默认参数在函数原型中给出,必须从右向左添加默认值。

函数重载

关键是参数列表不同,类型引用和类型在重载时被视为同一个特征标。

同时存在多个重载函数时,不能进行强制转换匹配。

重载函数在编译时将进行名称修饰,以区别不同的重载函数。

模板函数

这里的模板也称参数化类型。

类似交换两个任意类型变量的值:

 template<class T>
void tSwap( T &a, T &b )
{
T temp;
temp = a;
a = b;
b = temp;
}

编译器将在编译时根据调用时使用的参数类型生成相应的函数。如使用 int,则将 T 替换成 int,生成一个函数。

这意味着模板并不能缩短最终编译的文件长度,它的好处在于安全地生成多个同样功能的函数以及减少手工编写代码量。

函数模板也可以重载,如:

 template<class T>
void tSwap( T &a, T&b ); template<class T>
void tSwap( T *a, T *b, int n );

但是当参数列表形式相同,又想为特定的类型调用特定的函数时,可使用显示具体化或显示实例化:

 //函数模板
template<class T>
void tSwap( T &a, T&b ); //显示具体化
template<> void tSwap<className>( className &A, className &B );
//或者
template<> void tSwap( className &A, className &B ); //显示实例化
template void tSwap<className>( className &A, className &B );