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. dbf 命令 及数据类型

    left()函数只能截取左边几位字符,截取中间字符用SUBSTR() SUBSTR(cExpression, nStartPosition [, nCharactersReturned]) dbf u ...

  2. Windows Server 2003 简体中文企业版

    Windows Server 2003 简体中文企业版,真正免激活. CD-KEY:JB88F-WT2Q3-DPXTT-Y8GHG-7YYQY 安装序列号:JCGMJ-TC669-KCBG7-HB8X ...

  3. Eclipse注释配置

    新的文件/** * @ClassName: ${type_name}  * @Description: ${todo} * @author ${user} * @date ${date} ${time ...

  4. Python基础学习九 单元测试

    import unittest import HTMLTestRunner #产生测试报告 from BeautifulReport import BeautifulReport def calc(x ...

  5. jvm的happens-before原则

    提到并发,通常首先想到是锁,其实对共享资源的互斥操作是一方面,在Java中还有一方面是内存的可见性和顺序化,了解JMM的同学可能会更清楚些,内存可见性和顺序性同样非常重要,在这里简单提一下JMM模型, ...

  6. ros ddns

    ROS5X-6X脚本(10-15分钟执行一次) #DDNS本站帐号 :global ddnsuser "用户名" #DDNS本站密码 :global ddnspass " ...

  7. iOS开发基础控件--UITextField

    001 //初始化textfield并设置位置及大小 002   UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20 ...

  8. 实现二叉树的基本操作(Java版)

    近期研究了一下二叉树,试着用Java语言实现了二叉树的基本操作,下面分享一下实现代码: package com.sf.test; import java.util.ArrayDeque; import ...

  9. ios广告封装

    代码地址:https://github.com/CoderZhuXH/XHLaunchAd

  10. IPMI命令

    yum -y install ipmitool/etc/init.d/ipmi start ipmitool -I open lan set 1 ipaddr 172.16.8.33ipmitool ...