您的位置:首页 > 编程语言 > C语言/C++

C++中 函数的升级---内联函数、默认参数、占位参数、函数重载、C与C++结合

2017-02-21 16:42 579 查看

内联函数

C++中推荐使用内联函数替代宏代码片段。

C++中使用inline关键字声明内联函数。



内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。

内敛函数的特点:

C++编译器可以将一个函数进行内联编译。

被C++编译器内联编译的函数叫做内联函数。

内联函数在最终生成的代码中是没有定义的。

C++编译器直接将函数体插入函数调用的地方。

内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)。

内敛函数与宏定义代码块的区别:

内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等)。

内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求。

内联函数由编译器处理,直接将编译后的函数体插入调用的地方。

宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程。

内联函数比宏定义代码块更安全

C++编译器不一定准许函数的内联请求。

现代C++编译器能够进行编译优化,因此一些函数即使没有inline声明,也可能被编译器内联编译。

另外,一些现代C++编译器提供了扩展语法,能够对函数进行强制内联:

如:g++中的 _ attribute _ ((always_inline))属性,加到函数声明后面。

C++中内联编译的限制:

不能存在任何形式的循环语句。

不能存在过多的条件判断语句。

函数体不能过于庞大。

不能对函数进行取址操作。

函数内联声明必须在调用语句之前。

编译器对于内联函数的限制并不是绝对的,内联函数相对于普通函数的优势只是省去了函数调用时压栈,跳转和返回的开销。因此,当函数体的执行开销远大于压栈,跳转和返回所用的开销时,那么内联将无意义。

函数的默认参数

C++中可以在函数声明时为参数提供一个默认值,当函数调用时没有指定这个参数的值,编译器会自动用默认值代替。

函数默认参数的规则:

只有参数列表后面部分的参数才可以提供默认参数值。一旦在一个函数调用中开始使用默认参数值,那么在参数列表中,在这个参数后的所有参数都必须使用默认参数值。有一个用了,后面的都要定义默认值。

函数的占位参数

在C++中可以为函数提供占位参数

占位参数只有参数类型声明,而没有参数名声明。

一般情况下,在函数体内部无法使用占位参数。

占位参数的意义:

为以后程序的扩展留下线索

兼容C语言程序中可能出现的不规范写法

举例说明:



C++中的函数重载 Overload

重载(Overload)的概念:同一个标识符在不同的上下文有不同的意义。

函数重载(Function Overload)

用同一个函数名定义不同的函数。

当函数名和不同的参数搭配时函数的含义不同。

当函数默认参数遇到函数重载时,很有可能会发生二义性,因此在编写程序时,不要同时使用这两个。

函数重载至少满足下面的一个条件:

参数个数不同

参数类型不同

参数顺序不同

编译器调用重载函数的准则:

1、将所有同名函数作为候选者

2、尝试寻找可行的候选函数(以下3个同时进行)

精确匹配实参

通过默认参数能够匹配实参

通过默认类型转换匹配实参

3、匹配失败

最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。

无法匹配所有候选者,函数未定义,编译失败。

函数重载的注意事项:

重载函数在本质上是相互独立的不同函数。

重载函数的函数类型是不同的。

函数返回值不能作为函数重载的依据,函数重载是由函数名和参数列表决定的。

函数重载与函数指针:

当使用重载函数名对函数指针进行赋值时:

根据重载规则挑选与函数指针参数列表一致的候选者。

严格匹配候选者的函数类型与函数指针的函数类型。

C++和C程序的相互调用

在项目中融合C++和C代码是实际工程中不可避免的。

虽然C++编译器能够兼容C语言的编译方式,但C++编译器会优先使用C++的方式进行编译。

利用extern关键字强制让C++编译器对代码进行C方式编译。

举例说明,C++调用C编写的函数:

//告诉编译器,这个头文件中的代码是c语言,用C的方式编译
extern "C"
{
#include "add.h"
}


举例说明,C程序调用C++编写的函数:

//告诉编译器,C++编写的头文件和cpp文件都要用C的方式编译
extern "C"
{
#include "add.h"
int add(int a, int b)
{
return a + b;
}
}


统一的解决方案:

__cplusplus是C++编译器内置的标准宏定义。

__cplusplus的意义:

让C代码即可以通过C编译器的编译,也可以在C++编译器中以C方式编译。

如下图所示,函数是由C代码编写的:



注意:

C++编译器不能以C的方式编译多个重载函数,C语言中没有重载。

C和C++并不对立,可以同时存在于项目中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息