21天学通C++学习笔记(七):函数
1. 为什么需要函数
- 可将应用程序的内容划分成依次调用的逻辑块,让您能够划分和组织程序的执行逻辑,有助于提高可重用性。
2. 基本概念
- 是子程序,可接受参数,可有返回值。
- 要让函数执行其任务,必须调用它。
- 函数原型/声明
- 指出函数的名称(Area)、接受的参数列表以及返回值类型。
- 让编译器意识到这些语句是合法的,而链接器负责将函数调用与实现关联起来,并确保程序执行时将触发它们。
- 函数定义
- 总是一个包含在{}中的语句组成的语句块
- 函数调用、形参、实参
- 函数声明中包含的参数列表中的参数是形参(parameter),形参类似于局部变量,旨在当前函数内部可用
- 调用函数时(必须)提供的参数列表中的参数是实参(argument),它们是函数的形参列表要求的值
- 带默认值的函数参数
- 相当于是可选参数,用户可以传实参,也可以不传
- 不管有几个,必须在形参列表结尾
- 可被用户提供的值覆盖
- 返回值
- 除非返回类型声明为void,否则至少包含一条return语句(有些程序员喜欢仍然返回一条空的return语句:return;)
- 也可以由多条return语句,但要谨慎,比在末尾返回的函数难理解。
- 递归函数
- 调用自己
- 必须有明确的退出条件
- 如果没有退出条件或存在bug,有可能一直调用自己,直到栈溢出后才终止,导致应用程序崩溃
3. 使用函数处理不同类型的数据
- 函数重载
- 名称和返回类型相同,但参数不同的函数
- 传递数组参数
- 如果传数组参数,最好把长度也传上,方便函数内进行判断
- 使用字符数组时,最好把最后一个初始化为'\0'
- 按引用传递参数
- void Area (double radius, double& result)
- &告诉编译器,不要将第二个实参复制给函数,而将指向该实参的引用传递给函数。
- 使用return时函数只能返回一个值,因此如果函数需要执行影响众多值的操作,且需要在调用者中使用这些值,则按引用传递参数时让函数将修改结果提供给调用模块的方式之一。
4. 微处理器如何处理函数
- 调用逻辑
- 使用一个栈存储函数调用开始时的位置,然后再进入子函数体中,接着在遇到return时才从栈中找出原地址,并返回继续执行外层代码。
- 编译器使用CALL(函数调用)和RET(类似return)指令
- 编译器有许多优化选项,优化代码大小时,可能会护忽略众多的内联请求;优化速度时,编译器通常会寻找并利用合理的内联机会。
- 内联函数
- 函数很简单并需要降低开销(调用函数反而比函数逻辑复杂时)时才使用,不然每个调用的地方都会拷一份相当的函数定义代码,导致代码急速膨胀
- 参考
- 自动推断返回类型
- 与auto类型的变量类似,函数必须先定义,并且每个return的返回类型都要相同,不然编译器难以判断
- lambda函数
- C++11引入的,有助于使用STL算法对数据进行排序或处理
- 作为谓词使用,简化了排序函数、foreach等需要的复杂的二元谓词(是这样一个函数,对两个参数进行比较,并返回true或false,通常被实现为类中的运算符)的定义
21天学通C++学习笔记(七):函数的更多相关文章
- 21天学通C++学习笔记(九):类和对象
1. 类和对象 现实中的人等事物往往具备一些特征并且可以做某些事情,要在程序中模拟这些事物,需要一个结构,将定义其属性(数据)以及其可用这些属性执行的操作(函数)整合在一起.这种结构就是类,而这种结构 ...
- 21天学通C++学习笔记(八):指针和引用
1. 简述 C++最大的优点之一是,既可以用它来编写不依赖于机器(主要是内存)的高级应用程序,又可以用它来编写与硬件紧密协作的应用程序. 事实上C++让您能够在字节和比特级调整应用程序的性能,而要编写 ...
- 21天学通C++学习笔记(四):数组和字符串
1. 数组 概念 是一组元素 这些元素是相同的数据类型 按顺序存储到内存中 目的是避免在业务需要时去重复声明很多同类型的变量 初始化 分别初始化:int i [5] = {1,2,3,4,5}; 全部 ...
- 21天学通C++学习笔记(二):C++程序的组成部分
1. 预处理器编译指令 预处理器是一个在编译前运行的工具. 预处理器编译指令是向预处理器发出的命令,总是以磅字符#大头. #include让预处理器获取指定文件并将它们放在编译指令所处的位置.#inc ...
- 21天学通C++学习笔记(三):变量和常量
1. 简述 内存是一种临时存储器,也被称为随机存取存储器(RAM),所有的计算机.智能手机及其他可编程设备都包含微处理器和一定数量的内存,用地址来定位不同的存储区域,像编号一样. 硬盘可以永久的存储数 ...
- 21天学通C++学习笔记(一):入门
1. 基础概念 1.1 编程语言 旨在让人更容易得使用计算资源,充分利用电脑,不用人做一些重复劳动或持续参与. 1.2 可执行文件 是可运行的成品,应按程序员希望的那样做. 1.3 生成可执行文件的步 ...
- python学习笔记(七)-函数
函数 方法 功能说白了,函数就是把一堆代码组合到一起,变成一个整体.函数不调用不会被执行.作用在于提高代码的复用性.定义函数 def greet_user(): """关 ...
- 21天学通C++_Day1
被阿里实习生的第一轮电话面试刷掉以后,幡然醒悟,发现以前学习的C++基础一点都不扎实.为了把基础打扎实,重新学习一遍:为了让自己不放弃,也顺便可以把当天学到的东西记录下来,开始了写博客. 学习书籍:& ...
- 21天学通PythonPDF高清完整版免费下载|百度云盘
百度云盘:21天学通PythonPDF高清完整版免费下载 提取码:nqa9 豆瓣评分: 书籍封面: 内容简介 · · · · · · <21天学通Python>全面.系统.深入地讲解了P ...
随机推荐
- ReportMachine 打印机横向
Portrait 纵向 landscape 横向 RM_reg.pas :TRMPageSetupForm 打印机设置RM_PageSetup.dfm TRMPageSetting定义在RM_Pri ...
- Spring Session 学习记录1
先写些废话 新公司项目是有用到redis,之前老公司使用的缓存框架是ehcache.我redis并不熟悉.看过介绍以后知道是个nosql..既然是个数据库,那我想操作方法和jdbc操作关系数据库应该差 ...
- Java中异常体系
Java中的异常体系 Throwable,是一个类,表示可抛出的,它是所有的异常都继承的类. Throwable的子类,又分为两种,一种是Error,另一种是Exception. Error一般不是应 ...
- hibernate nhibernate sqlserver数据库的默认值冲突解决
数据库中一个字段的默认值设为0,当用hibernate插入数据时,没有对该字段进行操作,结果该字段居然不是0,而是空.后来google了一下,发现应该在.hbm.xml文件中添加一些参数定义(示例中的 ...
- unit_2_homework
随记2018/4/23 # 找元祖中的元素,移除每个元素的空格,并查找以a或A开头,c结尾的所有元素. # 思路:将i取出来,求得li列表中有多少个元素for i in range(len(li)): ...
- css常用属性初总结第一弹:id和class选择器
前言:这是我第二次写博客,记录自己所学的点点滴滴,希望大家一起共勉! 说到选择器大家都不陌生,估计用的最多的还是id选择器和类选择器,至于其他的选择器,今天在这里我避而不谈. 类选择器:将html元素 ...
- python3企业微信群组报警
公司提出一个需求需要做一个企业微信的一个消息推送,需要将消息发送到聊天群里详细信息如下. 如何创建应用请阅读我的上篇文章:https://www.cnblogs.com/wangyajunblog/p ...
- SpringData JPA整理
一 首先熟悉几种jpa中的接口Repository,CrudRepository,PagingAndSortingRepository,JpaRepository,JpaSpecificationEx ...
- 276. Paint Fence篱笆涂色
[抄题]: There is a fence with n posts, each post can be painted with one of the k colors. You have to ...
- 以女朋友为例讲解 TCP/IP 三次握手与四次挥手
背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次. 从好上开始,到现在,一年多也算坚持下来了. 问题 有时候聊天的过程中,我的网络或者她的网络可能会不好,视频就会卡住,听不到对方的声 ...