本篇文章主要介绍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. 攻防世界-MISC:a_good_idea

    这是攻防世界高手进阶区的第十题,题目如下: 点击下载附件一,解压后得到一张图片,把图片放到kali用binwalk查看一下,果然包含了几个文件, 用命令把文件分离出来, 得到一个misc文件和一个压缩 ...

  2. C# 有关List<T>的Contains与Equals方法

    [以下内容仅为本人在学习中的所感所想,本人水平有限目前尚处学习阶段,如有错误及不妥之处还请各位大佬指正,请谅解,谢谢!]   !!!观前提醒!!! [本文内容可能较为复杂,虽然我已经以较为清晰的方式展 ...

  3. Docker的三种网络代理配置

    开源Linux 长按二维码加关注~ 上一篇:IPv6技术白皮书(附PDF下载) 有时因为网络原因,比如公司NAT,或其它啥的,需要使用代理.Docker的代理配置,略显复杂,因为有三种场景.但基本原理 ...

  4. SSO 方案演进

    背景介绍 随着业务与技术的发展,现今比以往任何时候都更需要单点登录 SSO 身份验证. 现在几乎每个网站都需要某种形式的身份验证才能访问其功能和内容. 随着网站和服务数量的增加,集中登录系统已成为一种 ...

  5. 从rocketmq入手,解析各种零拷贝的jvm层原理

    在上一篇文章中,主要介绍了rocketmq消息的存储流程.其主要使用了mmap的零拷贝技术实现了硬盘和内存的映射,从而提高了读写性能.在流程中有一个非常有意思的预热方法并没有详细分析,因为其中涉及到了 ...

  6. 109_Power Pivot客户ABC(帕累托)分析度量值写法(非计算列)

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 1.背景 客户ABC分析,一般的套路是在计算列中把客户ABC分类,便于后续维度使用.今天用度量值的方式写一个ABC的分类. ...

  7. 推荐一款新框架PyScript:在 HTML 嵌入 Python 代码!

    一.介绍 网页浏览器是目前世界上最普遍,最可携的计算机环境.几乎所有人都可以在计算机或是手机上使用网页浏览器,以没有基础设施障碍的方式访问程序. 在 PyCon US 2022 上,知名 Python ...

  8. Android源码环境生成Android SDK并导入Adnroid Studio

    1.发现问题 之前使用Repo同步Android源码使用的是下面这条指令,即同步的是分支android-7.1.2_r18的代码 repo init -u https://mirrors.tuna.t ...

  9. monit 命令详解(monit)

    monit是Monit软件的主操作控制命令. 语法 monit [options]+ [command] 选项(options) -c file 指定要使用的配置文件 -d n 每间隔多少秒运行一次M ...

  10. MQ 简介

    每日一句 You must try things that may not work. And you must not let anyone define your limits because o ...