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++学习笔记(七):函数的更多相关文章

  1. 21天学通C++学习笔记(九):类和对象

    1. 类和对象 现实中的人等事物往往具备一些特征并且可以做某些事情,要在程序中模拟这些事物,需要一个结构,将定义其属性(数据)以及其可用这些属性执行的操作(函数)整合在一起.这种结构就是类,而这种结构 ...

  2. 21天学通C++学习笔记(八):指针和引用

    1. 简述 C++最大的优点之一是,既可以用它来编写不依赖于机器(主要是内存)的高级应用程序,又可以用它来编写与硬件紧密协作的应用程序. 事实上C++让您能够在字节和比特级调整应用程序的性能,而要编写 ...

  3. 21天学通C++学习笔记(四):数组和字符串

    1. 数组 概念 是一组元素 这些元素是相同的数据类型 按顺序存储到内存中 目的是避免在业务需要时去重复声明很多同类型的变量 初始化 分别初始化:int i [5] = {1,2,3,4,5}; 全部 ...

  4. 21天学通C++学习笔记(二):C++程序的组成部分

    1. 预处理器编译指令 预处理器是一个在编译前运行的工具. 预处理器编译指令是向预处理器发出的命令,总是以磅字符#大头. #include让预处理器获取指定文件并将它们放在编译指令所处的位置.#inc ...

  5. 21天学通C++学习笔记(三):变量和常量

    1. 简述 内存是一种临时存储器,也被称为随机存取存储器(RAM),所有的计算机.智能手机及其他可编程设备都包含微处理器和一定数量的内存,用地址来定位不同的存储区域,像编号一样. 硬盘可以永久的存储数 ...

  6. 21天学通C++学习笔记(一):入门

    1. 基础概念 1.1 编程语言 旨在让人更容易得使用计算资源,充分利用电脑,不用人做一些重复劳动或持续参与. 1.2 可执行文件 是可运行的成品,应按程序员希望的那样做. 1.3 生成可执行文件的步 ...

  7. python学习笔记(七)-函数

    函数 方法 功能说白了,函数就是把一堆代码组合到一起,变成一个整体.函数不调用不会被执行.作用在于提高代码的复用性.定义函数 def greet_user(): """关 ...

  8. 21天学通C++_Day1

    被阿里实习生的第一轮电话面试刷掉以后,幡然醒悟,发现以前学习的C++基础一点都不扎实.为了把基础打扎实,重新学习一遍:为了让自己不放弃,也顺便可以把当天学到的东西记录下来,开始了写博客. 学习书籍:& ...

  9. 21天学通PythonPDF高清完整版免费下载|百度云盘

    百度云盘:21天学通PythonPDF高清完整版免费下载 提取码:nqa9 豆瓣评分: 书籍封面: 内容简介  · · · · · · <21天学通Python>全面.系统.深入地讲解了P ...

随机推荐

  1. excel表格的应用之简单的数据可视化

    上面的为我们需要的手长与身高的数据 上面的是我们的数据可视化之后的点状图 我们需要先选中我们需要的数据表 然后点击我们插入中的推荐图表的选项 点开后会弹出这个界面 然后我们只需要选择char进行插入就 ...

  2. vs2012 未找到与约束 ContractName Microsoft.VisualStudio.Utilities.IContentTy...

    错误的大致内容,不能加载某个文件,需要修改web.config文件或者重命名新建.... 周末360大神帮我修复了一下电脑,然而,这一修复导致周一早上的一连串状况, 以上就是错误本尊,刚开始以为同事提 ...

  3. 用django框架开发一个B2C购物网站用户注册知识点总结2

    一:用户部分: 用户注册: 用户注册序列化器: import re from django_redis import get_redis_connection from rest_framework ...

  4. 201671010127 2016-2017-11 Java图形用户界面设计技术

    一.事件处理器 1.什么是事件处理 一个事件要求特定的动作被执行,它被作为消息由外界或系统自身发送给GUI系统.这些事件包括来自计算机设备如鼠标键盘和网络端口的I/O中断,以及GUI系统的逻辑事件触发 ...

  5. GC类

    [GC类] GC是一个静态类. 垃圾回收器跟踪并回收托管内存中分配的对象.垃圾回收器定期执行垃圾回收以回收分配给没有有效引用的对象的内存.当使用可用内存不能满足内存请求时,垃圾回收会自动进行.或者,应 ...

  6. solr的简单部署:在tomcat中启动slor

    1,首先要下载solr 途径1: 官网网址: http://lucene.apache.org/ 与Lucene的官网是一个 途径2: 下载历史版本的网址: http://archive.apache ...

  7. 191. Number of 1 Bits 二进制中1的个数

    [抄题]: Write a function that takes an unsigned integer and returns the number of ’1' bits it has (als ...

  8. spring中添加google的guava缓存(demo)

    1.pom文件中配置 <dependencies> <dependency> <groupId>org.springframework</groupId> ...

  9. Shiro 集成Spring 使用 redis时 使用redisTemplate替代jedisPool(五)

    1.添加依赖架包: <dependency> <groupId>org.springframework.data</groupId> <artifactId& ...

  10. Jenkins一天中构建多次

    Build after other projects are built:在其他项目触发的时候触发,里面有分为三种情况,也就是其他项目构建成功.失败.或者不稳定的时候触发项目: Poll SCM:定时 ...