函数特性

---------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】

原文地址:https://www.cnblogs.com/siwuxie095/p/6406581.html