zoukankan      html  css  js  c++  java
  • 函数特性

    ---------siwuxie095

       

       

       

       

    C++函数新特性:

       

    1、函数参数默认值

       

    2、函数重载

       

    3、内联函数

       

       

       

       

       

    函数参数默认值:

       

    如:第一个函数 fun() 有三个参数,后两个参数给了默认值,没问题

    第二个只给中间的参数 j 默认值,后面参数没有给,是有问题的

       

       

    给参数默认值时,有这样一个规则:

    一定要将参数的默认值写到参数列表的最右端

     

       

    也即从右往左赋值

       

       

       

    函数参数默认值在使用时的注意事项:

       

    如:

       

       

    定义时需要先进行声明,声明时可以加默认值,

    而定义时不建议把默认值写上

       

    经测试,如果在定义函数时也写上默认值,有些编译器

    可以通过,有些编译器是不可以通过的,而采用 声明给

    默认值,定义不给默认值 的方式,所有编译器都可以通过

       

       

    在使用时:无实参则用默认值,否则实参覆盖默认值

       

       

    即:

    如果传入的是 20,实际传入的就是 20、5、10;

    如果传入的是 2030,实际传入的就是 203010

    如果传入的是 203040,实际传入的就是 203040

       

       

       

       

       

       

       

    函数重载:

       

    一个前提:在相同作用域内

    两个条件:一是同名函数,二是参数个数 参数类型不同

       

    满足上述前提和条件的多个函数,互称为重载函数

       

     

       

    如:

       

       

       

    在真正调用时,计算机如何区分重载的函数?通过名称?

    名称都一样,都是 getMax,如果通过参数,计算机如何

    处理?

       

       

    在实际使用和编译过程中,如果 getMax 名称相同,

    参数个数 参数类型不同,在编译好之后,实际上

    是采用 名称+参数 的方式,形成了一个新的函数名,

    来区分两个所谓的同名函数

       

    而调用过程,计算机采用自动识别,根据传入的实参

    个数和类型,调用相应的函数

       

       

       

    重载带来的好处:

    如:求几个数的最大值:

    有时候想求 3 个数的最大值,

    有时候想求 5 个数的最大值,

    有时候想求结构体数组的最大值,

    总而言之:是要求最大值

       

    使用重载就不用再绞尽脑汁去想各种各样的名字,

    而且有时候在某种场合下只有一个名字是合适的,

    起名字时就可以起同样的名字,调用时计算机替你

    决定究竟哪一个函数是最适合当前调用的,提高了

    编码效率

       

       

       

       

       

       

       

       

    内联函数:

       

       

    内联函数和普通函数的区别:

       

       

       

    定义上没有太大的不同,在调用上的区别:如果使用主调函数

    main() 来调用一个普通函数 fun(),将进行五个步骤,首先调用

    fun(),找到 fun() 的相关函数入口,执行 fun() 里相关代码,再

    返回主调函数,主调函数再向下运行其他代码,直到结束

       

    内联函数则是在编译时就将函数体内 fun() 体内相关代码与相应

    实参替代掉主调函数 main() 里相关调用的代码

       

    即省掉了调用函数的 第二步 和 第四步,可以为调用过程节省很多

    时间,尤其是进行循环调用时,将会节省更多时间,有时候 第三步

    用的时间不长,反而是 第二步 第四步 用的时间更长,此时就非

    常适用于内联函数

       

       

    内联函数的标志,即关键字:

       

       

       

       

    如:

       

       

       

    化简后,代码展开:

       

       

       

       

       

       

    既然内联函数这么好,为什么不是所有地方都用内联函数,而是

    选择性的去使用内联函数?

       

       

       

    其实是基于以下几方面考虑:

    1、作为编译器来说,你即便把所有函数前都加上 inline,也是

    建议性的,所谓建议性,即 是不是要进行内联编译,由编译器

    根据情况决定,你只能告诉计算机你建议这一行代码 函数采

    用内联的方式进行编译

    2、作为内联函数来说,要求逻辑必须简单,其中不能够包含 for

    循环、while循环,这样的较为复杂的逻辑结构。而调用时,一般

    来说,调用频繁的函数,更建议使用内联函数

    3、如果内联函数写成一个递归函数,则无法成为内联函数,即便

    加上 inline,编译器都会将之作为普通函数进行调用或编译

       

       

       

       

    最后:

       

       

       

       

    程序 1

       

    #include <stdlib.h>

    #include <iostream>

    using namespace std;

       

       

    //一般函数有默认参数值在声明时给出 在定义时不写

    //因为定义时写了在某些编译器上可能通不过

    inline void fun(int i = 30, int j = 20, int k = 10);

    inline void fun(double i, double j);

       

    int main(void)

    {

    fun();

    fun(1.1, 2.2);

    fun(100,200);

    system("pause");

    return 0;

    }

       

    void fun(int i, int j, int k)

    {

    cout << i << "," << j << "," << k << endl;

    }

       

    void fun(double i, double j)

    {

    cout << i << "," << j << endl;

    }

       

    vs2013中:

       

       

       

       

    程序 2

       

    #include<stdlib.h>

    #include <iostream>

    using namespace std;

    /**

    *函数功能:返回ab的最大值

    *ab是两个整数

    */

    int getMax(int a, int b)

    {

    return a > b ? a : b;

    }

       

    /**

    * 函数功能:返回数组中的最大值

    * arr:整型数组

    * count:数组长度

    * 该函数是对上面函数的重载

    */

    int getMax(int *numArr,int count)

    {

    //定义一个变量并获取数组的第一个元素

    int maxNum = numArr[0];

    for (int i = 1; i < count ; i++)

    {

    //比较变量与下一个元素的大小

    if (maxNum<numArr[i])

    {

    //如果数组中的元素比maxNum大,则获取数组中的值

    maxNum = numArr[i];

    }

    }

    return maxNum ;

    }

       

    int main(void)

    {

    //定义int数组并初始化

    int numArr[3] = { 3, 8, 6 };

       

    //自动调用int getMax(int a, int b)

    cout << getMax(numArr[0],numArr[2]) << endl;

       

    //自动调用返回数组中最大值的函数返回数组中的最大值

    cout << getMax(numArr,3) << endl;

    system("pause");

    return 0;

    }

       

    vs2013中:

       

       

       

       

       

       

    【made by siwuxie095】

  • 相关阅读:
    Android性能优化典范(转)
    java分形树
    android通过pc脚本执行sqlite3脚本
    针对JD-GUI
    三星的中低端机使用AsyncTask的问题
    Github简明教程(转)
    android 5.0 (lollipop)源码编译环境搭建(Mac OS X)
    排队接水
    幂次方
    2020/4/12
  • 原文地址:https://www.cnblogs.com/siwuxie095/p/6406581.html
Copyright © 2011-2022 走看看