函数参数缺省和内联函数【C++】

liuyunluoxiao 2024-07-20 14:05:02 阅读 60

文章目录

函数参数缺省函数参数缺省的条件和要求

内联函数内联函数的工作原理内联函数的定义方法内联函数的要求解决方法:直接在.h中定义内联函数的函数体

内联函数再Debug模式下默认是不展开的

函数参数缺省

顾名思义:可以少传一个/多个参数给函数,但是该函数还能<code>正常运行

在这里插入图片描述

不像C语言中函数定义了几个参数就必须传几个参数函数才能工作


函数参数缺省的条件和要求

<code>必须在声明或者定义时给形参一个默认值

在这里插入图片描述

这样函数在参数缺省的时候就可以用形参的默认值工作,再有参数传入时,<code>从左往右把默认值覆盖

给函数的形参默认值时必须从右往左给【即右边的有默认值了,才能给左边的形参默认值

这样可以

在这里插入图片描述

但是这样不行

在这里插入图片描述

为什么呢?

因为函数形参接收参数是<code>从左往右接收的,所以左边的形参先接收到参数,如果少传了参数,参数就会被左边的形参数接收完毕,此时如果右边的形参没有默认值,函数就工作不了了

给函数默认值时不能跳着给

在这里插入图片描述

函数给默认值时,如果<code>函数有声明就必须在声明时给默认值,定义时不能再给

在这里插入图片描述


内联函数

内联函数是用空间换取时间的函数

注意:内联函数是程序员对编译器的<code>建议

如果程序员设定的内联函数的函数体太长,编译器就可能不会将它作为内联函数,还是将它视为普通函数


内联函数的工作原理

①把函数实现放在代码区,不放在栈区

即把函数的函数体展开在代码里,有点类似宏函数的展开

②把函数时间放在了代码区,就不用传参

去掉了传参的时间。

也省去了操作系统给栈区函数的形参分配值的时间。

③不放在栈区实现,操作系统就不用销毁回收空间,去掉了操作系统回收空间的时间。


内联函数的定义方法

直接在函数定义//声明的返回值前+一个关键字inline

即可

在这里插入图片描述

内联函数的调用方法和普通函数一样


内联函数的要求

<code>函数体不能太长,代码不能太多

为什么?

假设一个内联函数的函数体为100行代码

它会被调用100000次,每一次调用都会展开一次函数体到代码区去

那么它就会在代码区展开出100000*100行代码,会有很多重复的代码

而且这些代码都会被存在最终的可执行程序中,导致可执行程序的大小变大

而此时如果不用内联,那存入可执行程序的代码就只有100000+100行代码

其中100000行代码都是调用该函数的代码,100行代码是该函数的函数体

因为普通函数的函数体在栈中,每次调用时都会开辟栈区空间,再栈区空间中执行函数体,每次调用函数都是重复使用那函数的100代码

函数体里面不能有递归调用

因为内联函数每次调用都要在调用位置展开内联函数的函数体

编译器不知道递归什么时候能结束,就不知道会展开多少次,所以编译器不会接受把递归函数做内联函数

内联函数声明和定义不能分离在不同文件中在同一文件中可以

普通函数是可以分离的

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

内联函数不能分离

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

为什么呢?

因为内联函数是不进编译链接时的符号表的,也没有地址

<code>所以链接时找不到


解决方法:直接在.h中定义内联函数的函数体

因为被包含的头文件会在预处理时展开,所以包含了头文件的文件就内使用该头文件中定义的东西

(不了解编译和链接的可以看我这篇文章:c语言编译和链接)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


内联函数再Debug模式下默认是不展开的

因为展开了就和宏一样不方便调试



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。