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

文章目录

  • 函数参数缺省
    • 函数参数缺省的条件和要求
  • 内联函数
    • 内联函数的工作原理
    • 内联函数的定义方法
    • 内联函数的要求
      • 解决方法:直接在.h中定义内联函数的函数体
    • 内联函数再Debug模式下默认是不展开的

函数参数缺省

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

在这里插入图片描述

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


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

  1. 必须在声明或者定义时给形参一个默认值

    在这里插入图片描述
    这样函数在参数缺省的时候就可以用形参的默认值工作,再有参数传入时,从左往右把默认值覆盖

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

    这样可以
    在这里插入图片描述
    但是这样不行
    在这里插入图片描述
    为什么呢?
    因为函数形参接收参数是从左往右接收的,所以左边的形参先接收到参数,如果少传了参数,参数就会被左边的形参数接收完毕,此时如果右边的形参没有默认值,函数就工作不了了

  3. 给函数默认值时不能跳着给
    在这里插入图片描述

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

    在这里插入图片描述


内联函数

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

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

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


内联函数的工作原理

①把函数实现放在代码区,不放在栈区
即把函数的函数体展开在代码里,有点类似宏函数的展开

②把函数时间放在了代码区,就不用传参
去掉了传参的时间。
也省去了操作系统给栈区函数的形参分配值的时间。

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


内联函数的定义方法

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

在这里插入图片描述

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


内联函数的要求

  • 函数体不能太长,代码不能太多

为什么?
假设一个内联函数的函数体为100行代码
它会被调用100000次,每一次调用都会展开一次函数体到代码区去
那么它就会在代码区展开出100000*100行代码,会有很多重复的代码

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

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

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

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

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

因为内联函数每次调用都要在调用位置展开内联函数的函数体
编译器不知道递归什么时候能结束,就不知道会展开多少次,所以编译器不会接受把递归函数做内联函数

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

    普通函数是可以分离的
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

内联函数不能分离
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

为什么呢?

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

所以链接时找不到


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

因为被包含的头文件会在预处理时展开,所以包含了头文件的文件就内使用该头文件中定义的东西
(不了解编译和链接的可以看我这篇文章:c语言编译和链接)


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/588976.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

科东软件参加广州机器人产业联盟举办先进工业母机专家研讨会

工业母机是“制造机器的机器”,具有基础性、通用性、战略性特征,包括了减材切削机床、等材成形装备、增材制造装备及其控制系统等,是衡量国家工业水平和竞争力的重要标志。广东省作为全球知名的制造业基地,非常重视高端装备领域工…

2024年第三期丨全国高校大数据与人工智能师资研修班邀请函

2024年第三期 杭州线下班 数据采集与机器学习实战(Python) 线上班 八大专题 大模型技术与应用实战 数据采集与处理实战(Python&八爪鱼) 大数据分析与机器学习实战(Python) 商务数据分析实战&…

AI数据质量监控:数据质量的关键KPI都有哪些?

AI所支持的程序或设备成功实施的关键取决于用于训练模型的数据。使用低质量训练数据会导致模型训练不良,从而可能需要额外时间和预算进行重新训练和测试。为防止这种情况,最佳方法是在模型训练过程中实施质量检查。需要注意的是,不同质量度量…

LVS几种模式介绍

备注:这篇真的是水文,不看也罢。 LVS,linux virtual server,可提供IP网络层的负载均衡。 其主要模式主要有以下几种: LVS-NAT 主要通过网络地址转换,修改目的IP实现。Network Address Translation LVS-…

JS封装网页进入/退出全屏功能,兼容各大主流浏览器

1、演示 2、封装进入全屏函数 mozRequestFullScreen:兼容Firefox webkitRequestFullscreen:兼容 Chrome、Safari、Opera msRequestFullscreen:兼容:IE/Edge const enter () > {const element document.documentElementif (el…

32-数据处理:如何高效处理应用程序产生的数据?

如何更好地进行异步数据处理。 一个大型应用为了后期的排障、运营等,会将一些请求数据保存在存储系统中 。例如:应用将请求日志保存到 Elasticsearch 中,方便排障;网关将 API 请求次数、请求消息体等数据保存在数据库中&#xff…

.net 6 swagger Failed to load API definition

为什么会出现这样的问题? 因为swagger用的是restful 规则同一个路径下面,只有一个Get、Post、Put 如果你控制器下面有多个HttpGet、HttpPost、HttpPut 请求就会报错 正确方式,在控制器上添加路由[Route("api/[controller]/[action]")] 或…

算法练习第四十二天|01背包问题、416. 分割等和子集

一些背包问题 01背包问题 题目描述 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自…

蓝桥杯嵌入式学习笔记(9):RTC程序设计

目录 前言 1. RTC介绍 2. 使用CubeMx进行源工程配置 3. 代码编程 3.1 准备工作 3.2 进行bsp_rtc.h编写 3.3 进行bsp_rtc.c编写 3.4 main.c编写 3.4.1 头文件引用 3.4.2 变量声明 3.4.3 子函数声明 3.4.4 函数实现 3.4.5 main函数编写 4. 代码实验 5. 总结 前言 因本人备赛蓝…

如何使用 Python 本地客户端操作读写云服务器 Redis 缓存数据库详细教程(更新中)

Redis 基本概述 Redis(Remote Dictionary Server)是一个开源的使用 ANSI C 语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。它通常被称为数据结构服务器,因为值(value…

Kubernetes(k8s):如何进行 Kubernetes 集群健康检查?

Kubernetes(k8s):如何进行 Kubernetes 集群健康检查? 一、节点健康检查1、使用 kubectl 查看节点状态2、查看节点详细信息3、检查节点资源使用情况 2、Pod 健康检查2.1、 使用 kubectl 查看 Pod 状态2.2、 查看特定 Pod 的详细信息…

2012年认证杯SPSSPRO杯数学建模D题(第一阶段)人机游戏中的数学模型全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 减缓热岛效应 D题 人机游戏中的数学模型 原题再现: 计算机游戏在社会和生活中享有特殊地位。游戏设计者主要考虑易学性、趣味性和界面友好性。趣味性是本质吸引力,使玩游戏者百玩不厌。网络游戏一般考虑如何搭建安全可…