代码改变世界

白话C++系列(4)-- 函数新特性(默认值、重载、内联)

2016-04-09 21:33  Keiven_LY  阅读(1077)  评论(0编辑  收藏  举报

C++函数新特性

函数参数默认值

有如下函数声明:

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

void fun(int i, int j = 10, int k) ;X

注意:有默认参数值的参数必须在参数表的最右端

在函数声明时可以带上参数默认值,而在定义时,不建议带上参数默认值。如果在函数定义的时候也写上函数参数默认值,则实际编译时,有的编译器能够编译通过,而有的编译器编译不会通过。

示例:

#include <iostream>

#include<stdlib.h>

using namespace std;

 void fun(int i, int j = 10, int k = 20); //声明一个函数fun,其带有两个参数默认值

 void fun( int i, int j, int k)  //函数fun的定义

{

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

}

int main()

{

              fun(30);

              fun(30,40);

              fun(30,40,50);

              return 0;

}

输出结果如下:

30 10 20
30 40 20
30 40 50

从上面的输出结果,可以得出以下结论:无实参则用默认值,否则实参覆盖默认值

函数重载

什么是函数重载???

在相同作用域内,用同一函数名定义的多个函数,但这些多个函数之间的参数个数参数类型不同,则称这些多个函数就叫重载函数。

比如,定义以下两个函数(功能:取最大值)

int getMax(int x, int y, int z)

{

              //to do;

}

double getMax(double x, double y)

{

              //to do;

}

从上面两个函数可以看到,函数名都一样,但函数的参数个数和参数类型不同,这样两个函数就是重载函数。

思考:编译器如何识别重载的函数??

实际编译器编译时,经过如下操作:

int getMax(int x, int y, int z)经过编译后得到getMax_int_int_int

double getMax(double x, double y)经过编译后得到getMax_double_double

从上面的编译结果看,编译后会形成一个名称+参数的方式形成一个新的函数名,来区分两个重载函数;而调用过程中,计算机是采用的自动识别方式,即根据你传入的实参类型以及实参个数自动识别后,来调用相应的函数。

注意:关于函数重载的相关内容,这篇博客讲的更加深入: C++的函数重载

内联函数

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

1、内联函数与普通函数在定义方面区别不大

2、内联函数与普通函数在调用方面区别如下:

如果使用主调函数去调用一个普通函数,将进行如下5个步骤:

去调用fun() ->找到fun()的相关函数入口->执行fun()里的相关代码->返回主调函数->主调函数再运行其他代码直到结束

如果使用主调函数去调用内联函数时,编译时将函数体代码和实参替代掉函数调用语句,这样其实是省掉了上面的过程(2)和(4),这样可以为调用节省很多时间,尤其对循环调用时,将节省更多的时间。

内联函数关键字:inline

inline int max(int a, int b, int c); //声明一个内联函数max

int main()

{

              int i =10, j = 20, k = 30, m;

              m = max(i,j,k);

              cout<< "max = " << m <<endl;

              return 0;

}

实际上去调用max函数时,会化解成什么样的代码呢?来看一下代码展开:

int main()

{

              int i =10, j = 20, k = 30, m;

              int a, b, c;            

              a = i;b = j;c = k;

              if(b > a) a = b;

              if(c > a) a = c;

              m = a;

              cout<< "max = " << m <<endl;

              return 0;

}

思考:为什么不让所有函数都使用内联方式呢?

其实,是基于以下几个方面来考虑的:

1 对于编译器来说,内联编译是建议性的,由编译器决定;

2 作为内联函数来说,要求逻辑必须简单,调用频繁的函数建议适用内联函数

3 递归函数无法成为内联函数

代码实践

使用函数的重载完成返回最大值的方法。

现在有一个数组,定义一个方法getMax(),利用函数的重载,分别实现:

1、随意取出数组中的两个元素,传到方法getMax()中,可以返回较大的一个元素。

2、将整个数组传到方法getMax()中,可以返回数组中最大的一个元素。

完整可执行程序:

#include <iostream>
using namespace std;
/*
  *函数功能:返回a和b的最大值
  *a和b是两个整数
*/
int getMax(int a, int b)
{
return a > b ? a : b;
}

/*
  * 函数功能:返回数组中的最大值
  * arr:整型数组
  * count:数组长度
  * 该函数是对上面函数的重载
*/
int getMax(int *arr,int count)
{
    //定义一个变量并获取数组的第一个元素
int temp=arr[0];
for(int i = 1; i < count; i++)
    {
        //比较变量与下一个元素的大小
        if(temp<arr[i])
        {
            //如果数组中的元素比maxNum大,则获取数组中的值
            temp=arr[i];
        }    
    }
    return temp;
}

int main()
{
    //定义int数组并初始化
    int numArr[3] = {3, 8, 6};

    //自动调用intgetMax(int a, int b)
    cout<<getMax(6,3) <<endl;

    //自动调用返回数组中最大值的函数返回数组中的最大值
    cout<<getMax(numArr,3) <<endl;
    return 0;
}