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

文章目录

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

函数参数缺省

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

在这里插入图片描述

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


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

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

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

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

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

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

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

    在这里插入图片描述


内联函数

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

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

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


内联函数的工作原理

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

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

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


内联函数的定义方法

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

在这里插入图片描述

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


内联函数的要求

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

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

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

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

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

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

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

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

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

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

在这里插入图片描述

在这里插入图片描述

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

为什么呢?

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

所以链接时找不到


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

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


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


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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue+Mysql的企业客户信息反馈平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

Runes 协议创始人 Casey 发布了 24 个创世符文的名称的 idea

作者:Runes 中文社区 X/推:RunesCC 来看看 ChatGPT 对这些名字的解释,可以看出 Casey 的创世符文所追求的,是对不同文化、社会现象、人类情感的探索和思考,让不同的群体都能在这些 meme 中找到共鸣。 TRIPPLE•NIPPLE…

MySQL数据库(数据库连接池)

文章目录 1.批处理应用1.基本介绍2.批处理演示1.创建测试表2.修改url3.编写java代码 3.批处理源码分析 2.数据库连接池1.传统连接弊端分析2.数据库连接池基本介绍1.概念介绍2.数据库连接池示意图3.数据库连接池种类 3.C3P0连接池1.环境配置1.导入jar包2.将整个lib添加到项目中3…

真·面试题总结——JVM虚拟机

JVM虚拟机 JVM虚拟机规范与实现 JVM虚拟机规范 JVM虚拟机实现 JVM的常见实现 JVM虚拟机物理架构 JVM虚拟机的运转流程 JVM类加载过程 JVM类加载器及类加载器类型 JVM类加载器双亲委派机制 JVM运行时数据区的内存模型 JVM运行时数据区的内存模型:程序计数器…

蓝桥杯 - 玩具蛇

解题思路&#xff1a; dfs public class Main {static final int N 4;static int[][] visited new int[N][N];static int count;public static void main(String[] args) {for (int i 0; i < N; i) { //16种位置开始的可能for (int j 0; j < N; j) {dfs(i, j, 1);}…

稀碎从零算法笔记Day37-LeetCode:所有可能的真二叉树

今天的每日一题&#xff0c;感觉理解的还不够深&#xff0c;有待加深理解 题型&#xff1a;树、分治、递归 链接&#xff1a;894. 所有可能的真二叉树 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个整数 n &#xff0c;请你找出所有…

深入理解MySQL:拼接字符串、查询、删除表和创建索引的关键命令

MySQL是一种功能强大的关系型数据库管理系统&#xff0c;广泛应用于各种类型的应用程序中。本文将介绍MySQL中一些常用的关键命令&#xff0c;包括拼接字符串、查询、删除表和创建索引&#xff0c;帮助读者更好地理解和利用MySQL数据库。 mysql拼接字符串 在MySQL中&#xf…

C++ AVL树(旋转)

我们之前学习了搜索二叉树&#xff0c;我们知道普通的搜索二叉树会有特殊情况出现使得二叉树的两枝极其不平衡形成我们通俗说的歪脖子树&#xff1a; 这样的树一定会使得我们的增删查的效率变低&#xff1b;为了避免这种极端的情况出现&#xff0c;在1962年有两位伟大的俄罗斯数…

kubadm部署 kubernetes-1.29版本

一、集群节点准备 ip主机名称操作系统192.168.1.160master-1Centos-7.9192.168.1.161node-1Centos-7.9 二、安装前主机环境准备 &#xff08;所有主机都需要进行&#xff09; 1、配置主机名解析 echo "192.168.1.160 master-1" >> /etc/hosts echo "1…

C++符号清洗、Swift符号清洗, 编译还原

C 符号清洗&#xff08;编译还原&#xff09; C 由于函数重载的原因&#xff0c;针对每个函数符号&#xff0c;假如了name mangling的机制。导致堆栈适合机制阅读&#xff0c;因为每个函数符号都是独一无二的&#xff0c;但是这并非程序员易读的文字。 比如我们有这个符号cra…

又一AI工具开源!企业应该如何搭上这趟AI快车

大模型技术在近两年来飞速发展&#xff0c;企业对大模型的认知更加理性、务实。大模型本身不会直接产生价值&#xff0c;但在大模型基础架构之上开发出的AI应用&#xff0c;带来技术创新及业务增长&#xff0c;成为企业真正关心的问题。 基于大模型开发的又一个AI工具诞生&…

XenCenter 2024 导入虚拟机

导入虚拟机 虚拟机位置 导入到那一个服务器 导入虚拟机存放存储位置 虚拟机网卡配置 SR修复功能&#xff0c;看自己需求 虚拟机恢复确认最终配置 恢复好的虚拟机 虚拟机模板转换

源浩流体设备与您相约2024年第13届生物发酵展

参展企业介绍 温州源浩流体设备科技有限公司是一家集设计、开发、制造、销售、服务于一体的高科技企业&#xff0c;公司主要生产各种不锈钢阀门、管件、卫生级流体设备(卫生级换向阀,卫生级减压阀,卫生级罐底阀)等。现为温州市泵阀协会会员&#xff0c;ISO9000 2008版质量质量…

视频号视频下载小程序,让你随心保存你喜爱的视频!

今天给大家推荐一个非常实用的小程序&#xff0c;它就是专为下载视频号视频而设计的&#xff01; 微信视频号的兴起&#xff0c;让越来越多的优质、有趣的视频在平台上涌现&#xff0c;我们经常会遇到一些想要保存、回看的视频&#xff0c;但却无法轻易下载到手机或电脑中。这…

Linux基础篇:操作系统进程的基本概念与进程管理基础操作

Linux基础篇&#xff1a;操作系统进程的基本概念与进程管理基础操作 进程的定义&#xff1a; 进程是计算机系统中正在运行的程序的实例。 每个进程都有自己的内存空间、执行状态、资源和上下文。 进程是操作系统进行资源分配和调度的基本单位。 进程描述&#xff1a; 每个进…

LeetCode 63. 不同路径 II

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到右下角…

华为CCE部署RabbitMQ中间件操作文档

1、创建有状态&#xff08;StatefulSet&#xff09;部署 中间件一般为有状态部署&#xff0c;有状态部署与无状态部署区别参考文档&#xff1a;K8S有无状态部署-CSDN博客 1.1、基本信息 注意&#xff1a; 应用名称命名规则&#xff1a;&#xff08;命名规则最好统一&#xff…

深入理解npm常用命令

npm&#xff08;Node Package Manager&#xff09;是 Node.js 的包管理工具&#xff0c;用于管理 Node.js 应用程序的依赖包。除了安装、更新和卸载依赖包外&#xff0c;npm 还提供了许多其他功能&#xff0c;如初始化项目、运行脚本、查看依赖树等。本文将详细介绍一些常用的 …

设计模式-行为型-中介者模式-Mediator

同事抽象类 public abstract class Colleague {private Mediator mediator;public abstract void play(String data); } 视频同事 public class AudioColleague extends Colleague {public void play(String data) {System.out.println("画外音是&#xff1a;" d…

GrayLog日志平台的基本使用-接入jumpserver

1、jumpserver3.8.0部署 Docker 环境准备 # 安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 替换Docker 安装源为清华大学镜像站 sed -i sh…