11.C++函数参数与函数类型
![862c11e1c5a7004b3060d71d06d6be36.png](https://img-blog.csdnimg.cn/img_convert/862c11e1c5a7004b3060d71d06d6be36.png)
11.1 函数参数
函数是执行某个行为的代码块,就像榨汁机有榨汁功能,电饭锅可以做饭一样。
俗话说巧妇难为无米之炊,做饭需要水和米,榨汁机也要放入一定量的水果才能出来果汁。一个函数如果是用来处理数据的,那就要以适当的方式把某些数据传递给这个函数。
上一篇我们讲解了函数的结构,一个函数的结构总会有一个( )的部分。在声明一个函数时小括号可以有大用处:声明函数对传入参数的要求。比如说数据应该是什么类型的,需要有几个数据。
1.形参
如果你决定要在函数中使用数据,那就必须在( )中以“函数形式参数”的方式声明,参数也是变量,称为函数的形式参数,简称形参。
如同局部变量,形参也是局部有效的。一个函数的形参在程序进入函数时被创建,退出函数时被销毁。如下图例子函数,函数名为getLarger,这个函数的功能是比较两个小数的大小并返回较大的那个数。既然函数能比较任意的两个数的大小,那这个函数首先要能接受两个不同的数据值。所以在这个函数的声明部分小括号中列出两个形参:float类型的变量a和b。
![c257124e9d5adab5e3c8b4b4f398808a.png](https://img-blog.csdnimg.cn/img_convert/c257124e9d5adab5e3c8b4b4f398808a.png)
2.实参
写在函数声明中的参数叫形参,而真正在使用一个函数时,比如上图中第17行,我们是把main函数中两个实际的变量apple_price和banana_price传递给函数参与运算的。这个两个变量apple_price和banana_price叫做函数的实际参数,简称实参。
下面再举个例子看一下:
![2371bedd27857298d220433db6a7bf81.png](https://img-blog.csdnimg.cn/img_convert/2371bedd27857298d220433db6a7bf81.png)
上图中函数的形参是一个int数组和一个int变量,在第18行调用这个函数时传入的实参分别是数组myarray和表示数组长度的数据5。
3.形参的默认值
函数的形参都可以有一个默认值。所谓默认值就是函数在声明形参的同时保存在其中的一个数据值。形参的默认值一直保持不变,直到函数的使用者传入一个新数据时才会改变。如下图中的两个函数在声明的时候都给每个形参赋予一个默认值。
调用函数时,你可以有两个选择:让形参以默认值参与运算,或传入一个新的实参。如果你传入一个新的实参,那函数就以新的实参数据参与函数运算。
![c8da6430468eb715cd26f573c3e81892.png](https://img-blog.csdnimg.cn/img_convert/c8da6430468eb715cd26f573c3e81892.png)
11.2 返回值类型
1.有返回值
通过对函数的结构的了解,我们知道执行函数是可以产生一个结果的,这个结果叫函数的返回值。
如果你决定让一个函数返回一个结果,那么在声明函数时就声明这个函数返回值的类型,就像上图中第14行,计算一个数的N次方,并返回一个int类型的数据值。
2.无返回值
函数也可以不返回任何结果。比如在printArray函数中,函数体中将参数数组的元素输出在屏幕上,但是这个函数并没有任何结果返回。当声明一个函数没有返回值时,我们必须在函数名前面写上void。void意思就是一个函数没有返回值。
11.3 函数重载
如果有这样一组数学函数要你用代码写出来:
计算两个int整型数据的和;计算两个float浮点型(小数类型)数据的和;计算两个double浮点型型数据的和;
你是否要给每一个函数一个不同的名字呢?答案是不必须的。我们完全可以让这组函数拥有相同的函数名。
![d13fcb497bb7ba1adc80f35d542d0461.png](https://img-blog.csdnimg.cn/img_convert/d13fcb497bb7ba1adc80f35d542d0461.png)
上图中三个函数都有相同的名字add,但是函数的参数类型却完全不同。
如果函数的名字相同,参数的类型或数量不同,那这一组函数就构成了函数的重载。有了重载这个武器,你以后再也不用绞尽脑汁的去给函数起名字了。
11.4 函数模板
函数的重载已经帮了我们大忙了,但是要把所有类型的加法函数都写出来也很折磨人,更别提还有减法、乘法了,这简直是伤心病狂的要求。
还好C++ 有一神器可用:模板函数。模板函数就像一个老母鸡一样,可以孵化出来不同的函数。
![29edd8650c634d8653c36f27f45d5e61.png](https://img-blog.csdnimg.cn/img_convert/29edd8650c634d8653c36f27f45d5e61.png)
声明一个模板函数十分的简单、有趣,函数头前面只要添加一行代码就可以声明模板函数了。
template 英文含义:模板。用来声明函数是模板。 这里的class 表明T的身份是一个数据类型,而T泛指某一种具体的数据类型。
我们可以看到T 可以出现在函数的形参类型或返回值类型的位置上,因为T就是形参或返回值的类型。只不过T的类型现在并不确定,可以有很多变化,可以是int也可以是任意其他合理的类型。
只有在main函数中实际使用这个函数时,编译器才会依据传入的实参类型推断出T真正的类型,然后生成一个具体的函数实体。
模板中的参数类型可以有多个,V和T一样只是一种代号,你可以换成别的名字M或N等等。
模板函数的强大威力相信你已经从上面的例子中感受到了:模板函数中的数据类型真是变化莫测。
不知道你有没有发现,上面例子中两个模板函数之间也是一种重载关系!怎么样,你是否认为值得花点时间研究一下这些内容呢?