C++函数

 

转载知呼大佬06 - C++函数 - 知乎 (zhihu.com)

06 - C++函数

 

本期我们讨论的是 C++ 中的函数。

函数到底是什么呢,函数就是我们写的代码块,被设计用来执行特定的任务,以后我们学习 class 类的时候,这些块会被称为方法,但是当我说到函数时,我们讲的可不是 C++ 类里面的 方法。

01 函数能干什么

对我们来说,使用函数是很常见的,避免代码重复。我们不想重复写相同的代码,当然,如果我们也可以复制和粘贴很多代码,但会导致巨大的混乱,这也意味着如果我们决定改变一些代码,我们必须在所有这些地方改变它,我们粘贴的地方,那维护这些代码简直就是灾难,所以我们把我们要做的事情写成一个函数,然后可以多次调用它。

如果需要的话,你可以认为函数有一个输入,一个输出,尽管他们可能并不需要这么做。我们可以为函数提供一定的参数,函数可以为我们返回值。

02 定义函数

假设我们想把两个数相乘,我们想写出这样的一个函数。

 

format,png

我们对上面的代码做一些详细的解释。

首先写的是所谓的返回值 int,也就是说,这就是这个函数的返回类型,因为是两个整数相乘,这当然会得到一个整数 ;然后给出函数名 multiply ,它有两个参数 a 和 b ,这些就是我们要乘的数,它们的类型都是 int。然后给出函数体,它会返回 a*b 。

这样你就得到一个函数,它有两个都是整数的参数,该函数的功能是返回两者的乘积。

我们不一定非要提供参数,例如,我可以不提供任何参数,直接返回 5*8 ,这仍然是一个返回整数的函数,但它没任何参数。

 

format,png

我们也可以让函数不返回任何东西,我们通过写 void 作为返回类型来实现,void 意思是啥也没有,所以我们可以这样做。

 

format,png

03 调用函数

如何调用这个函数呢?调用一个函数非常简单,我们直接看下面的例子。

 

format,png

对上面的代码我们做一些解释。

首先我们定义了一个变量 result,来装这个结果,然后直接写函数的名字加括号就可以完成调用函数,括号里面的数字就是函数需要的两个参数,返回值 result 保存 a*b 的结果,最后我们将结果输出到控制台。按 F5 来运行程序,你可以看到我们得到显示是6,也就是2乘以3的结果。

04 为什么要用函数

所以,为什么要用函数呢?看起来代码还更多了一些。

让我们把情况说的更详细些,假设我要做一堆的乘法,我想把它们都记录到控制台,在没有函数的情况下,下面的情况这样看起来会很乱。

 

format,png

如果你运行了这些代码,你会发现我犯了一些错误,我想说的是,其实这种情况经常发生。人们复制和粘贴代码块, 然后忘记改变一个小细节,在某些情况下程序如果正常运行的话,你就有可能注意不到,直到它在某个地方出错了,你才会知道。

(你不会还没发现错在哪里吧?)

让我们修正这些代码。

 

format,png

这样我们会得到正确的结果。

上面的多段代码大部分内容基本差不多,基本的区别就是参与乘法的数字不同。这就很难受了。

让我们为这个重复的过程创建一个函数。

先分析一下具体的需求。这个函数应该不需要返回值,它只需要输出一些信息;这个函数需要两个参数,就可以完成每段代码中不同的部分;为了直观的联想到函数的功能,函数的名字就叫做 MultiplyAndLog 吧,然后我们就有了下面这个函数。

 

format,png

函数定义好后,我们要做的就是调用这个函数。

 

format,png

如果启动这个程序, 你可以看到,在这里可以获得正确的值,这是一个很简单的例子,我们获得了一个非常干净、易于阅读的程序。

通过以上给分析过程,我们有效地证明了函数是真的非常重要的。你的目标应该是将你的代码分开成很多函数。

然而, 有一件事我想强调,也不要把你的代码每一行都拆成函数,对任何人都没有好处的代码,这很难维护,您的代码将看起来凌乱不堪,它会让你的程序变慢。

原因是每次我们调用函数时,编译器生成一个call 指令,这基本上意味着,在一个运行的程序中,我们需要创建一个堆栈结构,这意味着我们必须把像参数这样的东西推进堆栈,我们还需要将一个叫做返回地址的东西,然后我们要做的是跳到二进制执行文件的不同部分,以便开始执行我们的函数指令。为了将 push 进去的结果返回,我们得回去到最初调用函数之前。就像在内存中跳跃来执行函数,跳跃和执行这些都需要时间,这些会减慢我们的程序。当然前提是保持我们当前的函数是作为一个实际的函数,而不是做内联inline的工作(我们会在未来深入讨论内联)。

我说这些都是因为不想让你们对于每一行代码都去创建函数,不要做那么搞笑的事情,编码多了你才能明白哪里你会需要一个函数,但基本上如果你看到自己在多次做一项共同的任务,那么基本可以为此创建一个函数,函数的主要目的是防止代码重复,我们不希望复制粘贴代码。

05 其他的

现在我们回到代码中,有些小伙伴会发现一个细节,main 函数需要返回 int 类型的值,可是在 main 函数体中却找不到 return 关键字。这样操作是合理的吗?

然我们做一个修改,验证一些东西。

 

format,png

Ctrl+F7 编译,我们得到了一个错误。

 

format,png

看起来有返回类型的函数的确必须有返回值。

原因是主函数实际上是一个特殊函数,只有主函数被豁免可以不返回值,它会自动假设你返回0。其他的函数必须要返回值。 main函数不写返回值的操作只是现代 C 和C++ 的一个特性,可以让你代码保持的干净一点。

好了,我们知道这必须返回一个值,刚才讲的东西实际上 只适用于调试模式,如果我们在release 模式下编译,这里你会看到我们没有得到错误,这并不是说我们现在做的是正确的,因为如果我们真的要拿返回值值做某些事情的话,我们会得到 “未定义的行为” 的报错信息,只是编译器不会报错,但是在调试模式下,编译器就会显示出错。

后话

好了,这是一个基本的函数介绍,函数真的很有用。未来我还会写很多函数,每个程序都是由一系列函数组成的,所以这是非常重要的,如果你不认为你完全理解函数是如何工作的,不用担心, 因为在这个系列中我们会写超级多的函数,你会掌握它的,最好的学习方法当然是多练习是吧。我们通常还将函数分解为声明和定义,声明通常存储在头文件中,我们在转换单元或 CPP 文件中编写定义,我将专门制作关于头文件的一期,在那里会讲到在头文件中函数如何声明。

 

 

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

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

相关文章

【计算机网络学习之路】Windows下的socket编程

文章目录 前言Windows下的socket编程1.预备工作2. socket编程 结束语 前言 本系列文章是计算机网络学习的笔记,欢迎大佬们阅读,纠错,分享相关知识。希望可以与你共同进步。 本篇文章仅记录Windows下socket编程和Linux的不同,并没…

Maven工程继承关系,多个模块要使用同一个框架,它们应该是同一个版本,项目中使用的框架版本需要统一管理。

1、父工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/PO…

红队攻防之Goby反杀

若结局非我所愿&#xff0c;那就在尘埃落定前奋力一搏。 本文首发于先知社区&#xff0c;原创作者即是本人 一、弹xss 为了方便&#xff0c;本次直接使用 PhpStudy 进行建站&#xff0c;开启的web服务要为MySQLNginx&#xff0c;这里的 PhpStudy 地址为 http://x.x.x.x&…

树与二叉树堆:二叉树

二叉树的概念&#xff1a; 二叉树是树的一种&#xff0c;二叉树是一个节点&#xff0c;最多只有两个子节点&#xff0c;二叉树是一个特殊的树二叉树的度最大为2 从上图可得一棵二叉树是结点的一个有限集合&#xff0c;该集合: 或者为空由一个根结点加上两棵别称为左子树和右子…

ECharts零基础使用思路 图表案例网站推荐

1、用npm安装echarts npm i echarts -S 2、引入 &#xff08;1&#xff09;可以在mian.js里全局引入 import echarts from ‘echarts’ Vue.prototype.$echarts echarts 将echarts挂载在Vue原型上 用时直接this.$echarts即可 &#xff08;2&#xff09;也可以在组件中按需引入…

〖大前端 - 基础入门三大核心之JS篇㊵〗- DOM事件监听及onxxx的使用

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

windows电脑连接Android和iPhone真机调试

windows电脑连接Android和iPhone真机调试 目前用的是Hbuilder X编辑器&#xff0c;在正常情况下&#xff0c;Android手机需要在 "设置 ----> 更多设置 ----->关于手机 ------> 版本号&#xff08;手指点击5-7下即可打开开发者模式&#xff09;"(我的是vivo的…

人工智能基础_机器学习046_OVR模型多分类器的使用_逻辑回归OVR建模与概率预测---人工智能工作笔记0086

首先我们来看一下什么是OVR分类.我们知道sigmoid函数可以用来进行二分类,那么多分类怎么实现呢?其中一个方法就是使用OVR进行把多分类转换成二分类进行计算. OVR,全称One-vs-Rest,是一种将多分类问题转化为多个二分类子问题的策略。在这种策略中,多分类问题被分解为若干个二…

小诺2.0开源版工程启动

小诺是一款开源的前后端开发框架&#xff0c;同若依、SpringBladex一样可作为私活、外包脚手架。 开源地址&#xff1a;Snowy: 最新&#xff1a;&#x1f496;国内首个国密前后分离快速开发平台&#x1f496;&#xff0c;采用Vue3AntDesignVue3 ViteSpringBootMpHuToolSaToke…

计算机基础知识56

choices参数的使用 # 应用场景&#xff1a; 学历&#xff1a;小学、初中、高中、本科、硕士、博士、1 2 3 4 5 6 客户来源: 微信渠道、广告、介绍、QQ、等等 性别&#xff1a;男、女、未知 # 对于以上可能被我们列举完的字段我们一般都是选择使用…

操作系统(三)| 进程管理上 进程状态 同步 互斥

目录 1 进程和程序区别 2 进程状态 2.1 进程的5种基本状态 2.2 进程状态之间转换 2.3 七状态模型 3 进程描述 3.1 进程控制块 PCB 3.2 进程块组织方式 4 进程控制 5 进程同步 互斥 5.1 区分进程互斥和同步 5.2 核心方案 5.3 其他方案 方案1 设置锁变量 方案2 严…

Mybatis Plus分页实现逻辑整理(结合芋道整合进行解析)

Mybatis Plus分页实现逻辑整理&#xff08;结合芋道整合进行解析&#xff09; 我希望如春天般的你&#xff0c;身着白色的婚纱&#xff0c;向我奔赴而来&#xff0c;我愿意用全世界最温情的目光&#xff0c;朝着你的方向望去——姗姗来迟。 1.背景介绍 https://baomidou.com/p…

selenium下载安装对应的chromedriver并执行

文章目录 selenium对应版本chrome驱动下载114以及之前的chrome版本119/120/121的chrome版本 chromedriver安装执行selenium代码 selenium Selenium是广泛使用的模拟浏览器运行的库&#xff0c;它是一个用于Web应用程序测试的工具。 Selenium测试直接运行在浏览器中&#xff0c…

【机器学习】033_反向传播

一、计算图、反向传播原理 1. 回顾前向传播 例&#xff1a;假设现在有一个神经网络&#xff0c;其仅有一个输出层和一个神经单元 定义 定义 &#xff0c;即激活函数对激活值不再做具体处理 定义平方损失函数 &#xff0c;计算a的值与真实值的差距 此时&#xff0c;通过计算…

032.Python面向对象_类补充_描述器

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

java: 无效的目标发行版: 17 问题解决

今天在写完类点击运行后显示java: 无效的目标发行版: 17 网上查询了一番&#xff0c;发现有几个地方需要注意。 还有一个就是设置中&#xff0c;下面的就是我本次问题所在&#xff0c;不知道为什么&#xff0c;他自动添加了下面的东西 一个方法是把目标字节码版本改为正确的&a…

跳台阶游戏(Python排列组合函数itertools.combinations的应用)

给定台阶总数和两种单次可跳级数&#xff0c;编写自定义函数&#xff0c;计算所有的游戏组合方案数量。 (笔记模板由python脚本于2023年11月19日 19:18:48创建&#xff0c;本篇笔记适合熟悉python自定义函数编写&#xff0c;了解排列组合知识的coder翻阅) 【学习的细节是欢悦的…

mysql 查询

-- 多表查询select * from tb_dept,tb_emp; 内来链接 -- 内连接 -- A 查询员工的姓名 &#xff0c; 及所属的部门名称 &#xff08;隐式内连接实现&#xff09;select tb_emp.name,tb_dept.name from tb_emp,tb_dept where tb_emp.idtb_emp.id;-- 推荐使用select a.name,b.n…

VMware——WindowServer2012R2环境安装mysql5.7.14解压版_互为主从(图解版)

目录 一、服务器信息二、192.168.132.35服务器上安装mysql&#xff08;主&#xff09;2.1、环境变量配置2.2、安装2.2.1、修改配置文件内容2.2.2、初始化mysql并指定超级用户密码2.2.3、安装mysql服务2.2.4、启动mysql服务2.2.5、登录用户管理及密码修改2.2.6、开启远程访问 三…

电脑显示msvcp140_1.dll丢失的5个常用解决方法,亲测可修复

常见于计算机操作中的"msvcp140_1.dll丢失"错误警示&#xff0c;往往令部分应用程序无法正常启动。为了解决这个问题&#xff0c;我们需要采取一些措施来修复丢失的文件。本文将介绍6个解决msvcp140_1.dll丢失的方法&#xff0c;帮助大家快速恢复计算机的正常运行。 …