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++并不对立,可以同时存在于项目中。
相关文章推荐
- C++ 引用、内联函数、函数默认参数、函数重载
- C++入门学习:内联函数、函数的默认参数和占位参数
- C++基础学习笔记----第三课(内联函数、默认参数、占位参数)
- 4、不一样的C++系列--函数的默认参数和占位参数
- C/C++的区别(默认值、内联函数、函数重载、const、引用、参数、返回值)
- <C++>c++程序有函数重载,能不能设置默认参数值?
- C++离航篇——函数默认参数、函数重载、内敛函数
- [C++学习笔记]--内联函数、函数重载、函数defualt参数
- 就让你歧义!(C++的默认参数函数与无参数函数的重载)
- 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板
- 北大 C++ 1.7 内联函数、函数重载和函数缺省参数
- C++之函数的默认参数
- C++的那些坑—函数的参数和重载
- [C++基础]006_函数默认参数
- C++默认函数与函数重载
- C++函数参数的默认值
- C++中对函数参数的升级
- C++中函数的默认参数
- C++中函数的默认参数
- C++引用调用、内联函数、带默认形参值的函数