本篇文章主要介绍C++语言中5中特殊形式的函数,分别是带默认形参值的函数、重载函数、内联函数、带形参和返回值的主函数以及递归函数。

一、带默认形参值的函数

  如果函数的形参在多数情况下都可以取某个固定的值,程序员可以在定义函数或声明函数原型时将该值指定为形式参数的默认值,这就是带默认形参值的函数。调用带默认形参值的函数时,如果给出实参,则将实参值赋值给形参变量,否则将默认值赋值给形参变量。

  示例:double Exchange(double amount,double rate = 6.8993)

     {

        return amount / rate;//实现人名币汇率换算,默认兑换成美元汇率6.8993

     }

  带默认形参值函数的语法细则:

    1)带默认值的形参,调用带默认形参值的函数时,如果给出实参,则将实参值赋值给形参变量,否则将默认值赋值给形参变量。

    2)在函数原型声明中指定默认值。如果函数定义调用语句之后,可以在调用语句之前对函数原型进行声明。声明时可以指定形式参数的默认值,此时函数定义中不在指定默认值。函数具有文件作用域,同一函数在相同作用域中只能指定一次默认值。

    3)同一函数在不同作用域可以指定不同默认值。如果多个默认值同时有效,调用函数时根据局部优先原则选择默认值。

    4)带默认值的形参必须定义在形参列表的后面。必须把带默认值的形参放在不带默认值的形参后面。

二、重载函数

  通常,同一文件中的函数不能重名,不同文件中的外部函数(非静态函数)之间也不能重名。C++语言规定:如果两个函数形参的个数不同或数据类型不同,那么这两个函数就可以重名。这样的重名函数被称为重载函数。注意:返回值类型或形参名字不同不能重载。

  示例:int Max(int x,int y); double Max(double x,double y); int Max(int x,int y,int z);这三个函数可以称重载。

     int Maz(int x,int y);和 double Max(int x,inty);不可以重载

三、内联函数

  内联函数是一种特殊函数,它在保证程序开发效率的同时,不见底程序的执行效率,其原理是:编译源程序时将函数代码直接嵌入到每一个调用语句处,而执行时不在进行函数跳转和数据传递。

  示例:inline double Exchange(double amount,double rate = 6.8993)

     {

        return amount / rate;//实现人名币汇率换算,默认兑换成美元汇率6.8993

     }

  内联函数的语法细则:

    1)关键字inline。在函数定义的函数头前面加关键字inline。如果函数定义在调用语句之后,或者在其他文件中,则在调用前声明该函数原型时加关键字inline。

    2)内联函数需是简单的函数。如果该函数的函数体比较复杂(例如包含循环语句),编译器将自动按照非内联的方式进行编译。

    3)内联函数的执行效率。内联函数只有被多次调用,其执行效率才能体现出来,因为一般只是将频繁调用的简单函数定义成内联函数。

四、带有形参和返回值的主函数

  C++语言标准对主函数main有如下规定:

    1) 一个C++程序有且仅有一个名为mian的主函数,主函数不能被重载。

    2)主函数是程序的起点。

    3)主函数的函数类型为int型,需返回一个int型整数。

    4)主函数可以定义形参来接收实参数据,也可以忽略形参(此时操作系统传递过来的实参数据将被忽略)。

  示例:有参形式

     int main(int argc,char *argv[ ])  //int main() 格式为无参形式

     {

        //此处为主函数代码

        return 0;

     }

    argc表示main接收到的参数个数。argv[0]表示该程序的文件名,argv[1]表示第一个实参数据。采用无参形式时,操作系统所传递过来的实参数据被忽略。主函数通过返回值传递自己的状态0为正常,-1为异常退出。

五、递归函数

  C++语言使用递归函数描述递归算法。递归函数的定义和调用域普通函数没什么两样,所不同的是递归函数的函数体应包含描述递归过程的三要素,即递归总结条件、已知结果和递归公式。

  一个典型递归函数定义形式如下:

    函数类型 函数名(形参列表)

    {

      . . .

      if(递归终结条件)

        取地已知结果;

      else

        按照递归公式调用自身;

    }

  示例:通过递归法求解阶乘N!

    int Factorial(int N)

    {

      int result;

      if (N == 0 )

        result = 1;

      else

        result = N * Factorial(N-1);

      return reslt;

    }

C++几种特殊形式的函数的更多相关文章

  1. JavaScript高级之函数的四种调用形式

    主要内容 分析函数的四种调用形式 弄清楚函数中this的意义 明确构造函对象的过程 学会使用上下文调用函数 了解函数的调用过程有助于深入学习与分析JavaScript代码. 本文是JavaScript ...

  2. 《从零开始学Swift》学习笔记(Day 7)——Swift 2.0中的print函数几种重载形式

    原创文章,欢迎转载.转载请注明:关东升的博客 Swift 2.0中的print函数有4种重载形式: l   print(_:).输出变量或常量到控制台,并且换行. l   print(_:_:).输出 ...

  3. javascript——四种函数调用形式

    此文的目的是分析函数的四种调用形式,弄清楚函数中this的意义,明确构造函对象的过程,学会使用上下文调用函数. 在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而 ...

  4. Tensorflow 损失函数及学习率的四种改变形式

    Reference: https://blog.csdn.net/marsjhao/article/details/72630147 分类问题损失函数-交叉熵(crossentropy) 交叉熵描述的 ...

  5. binlog的几种复制形式

    binlog的几种复制形式 MySQL 5.5 中对于二进制日志 (binlog) 有 3 种不同的格式可选:Mixed,Statement,Row,默认格式是 Statement.总结一下这三种格式 ...

  6. 应答流式RPC 请求流式RPC 向流式RPC 流式RPC的三种具体形式

    https://mp.weixin.qq.com/s/pWwSfXl71GQZ3KPmAHE_dA 用Python进行gRPC接口测试(二) 大帆船 搜狗测试 2020-02-07   上期回顾:用P ...

  7. #define宏定义形式的"函数"导致的bug

    定义了一个宏定义形式的"函数": #define  SUM8(YY)\ {\ int Y = YY>>2;\ ...\ } 然后使用的时候,传入了一个同名的变量Y: i ...

  8. JavaScript两种方法来定义一个函数

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 做推送,怎么能不了解推送的 4 种消息形式呢?( Android 篇)

    极光推送是为 App 提供第三方推送服务的平台之一,它提供四种消息形式:通知,自定义消息,富媒体和本地通知. 笔者将基于官方说明与个人理解来谈一下这四种消息.本篇为 Android 篇,iOS 篇入口 ...

随机推荐

  1. 变量命名 函数命名 方法 Naming cheatsheet

    Naming things is hard. This sheet attempts to make it easier. Although these suggestions can be appl ...

  2. 在centos 7 中 conda 环境和Python2.7 中安装远程jupyter

    折腾了半天,为了能够方便学习TensorFlow,搞了远程的jupyter,方便在本地使用它,今天填了不少坑. 装完后截图: 下面是一些步骤: 检查 Python 环境 CentOS 7.2 中默认集 ...

  3. NFS学习笔记

    一.NFS原理 ## 本次实验以CentOS7.7为例 [root@qll251 ~]# cat /etc/redhat-release CentOS Linux release 7.7.1908 ( ...

  4. vue - Vue组件化编程

    今天是对vue组件化的一个理解,最主要的单文件组件,然后就可以脚手架的学习了,本来昨晚就该上传的,但是用的那个上传博客园的Python脚本不行了,换了一个新的. 组件化让我越来越感觉到框架的力量了 一 ...

  5. web安全之自己写一个扫描器

    web安全之自己写一个扫描器 自己来写一个简单的目录扫描器,了解扫描器的运转机制和原理,因为python写脚本比较容易所以用python写一个网站目录扫描器. 第一步:我们需要导入所需要的库 1 im ...

  6. 【深入理解计算机系统CSAPP】第六章 存储器层次结构

    6 存储器层次结构 存储器系统(memory system)是一个具有不同容量.成本和访问时间的存储设备的层次结构.CPU 寄存器保存着最常用的数据.靠近 CPU 的小的.快速的高速缓存存储器(cac ...

  7. 好客租房48-组件的props(基本使用)

    组件是封闭的 要接受外部数据应该通过props来实现 props的作用:接受传递给组件的数据 传递数据:给组件标签添加属性 接收数据:函数组件通过参数props接收数据 类组件通过this.props ...

  8. linux篇-linux 主从配置

    1准备两台服务器 一台是192.168.118.128 一台是192.168.118.129 2主服务器配置 192.168.118.128 修改my.cnf文件 server-id=1 log-bi ...

  9. Spring 源码(17)Spring Bean的创建过程(8)Bean的初始化

    知识回顾 Bean的创建过程会经历getBean,doGetBean,createBean,doCreateBean,然后Bean的创建又会经历实例化,属性填充,初始化. 在实例化createInst ...

  10. TypeError: this.getOptions is not a function

    我在vue ui界面中安装版本依赖包后报这个错误 less-loader/sass-loader安装的版本过高 解决办法 删除原有的版本依赖包,安装更低版本的依赖包. 如 @6.0.1为选择安装的版本 ...