int * 类型的实参与 int 类型的形参不兼容_C++ 函数:形参实参,模板重载

11.C++函数参数与函数类型

862c11e1c5a7004b3060d71d06d6be36.png

11.1 函数参数

函数是执行某个行为的代码块,就像榨汁机有榨汁功能,电饭锅可以做饭一样。

俗话说巧妇难为无米之炊,做饭需要水和米,榨汁机也要放入一定量的水果才能出来果汁。一个函数如果是用来处理数据的,那就要以适当的方式把某些数据传递给这个函数。

上一篇我们讲解了函数的结构,一个函数的结构总会有一个( )的部分。在声明一个函数时小括号可以有大用处:声明函数对传入参数的要求。比如说数据应该是什么类型的,需要有几个数据。

1.形参

如果你决定要在函数中使用数据,那就必须在( )中以“函数形式参数”的方式声明,参数也是变量,称为函数的形式参数,简称形参。

如同局部变量,形参也是局部有效的。一个函数的形参在程序进入函数时被创建,退出函数时被销毁。如下图例子函数,函数名为getLarger,这个函数的功能是比较两个小数的大小并返回较大的那个数。既然函数能比较任意的两个数的大小,那这个函数首先要能接受两个不同的数据值。所以在这个函数的声明部分小括号中列出两个形参:float类型的变量a和b。

c257124e9d5adab5e3c8b4b4f398808a.png

2.实参

写在函数声明中的参数叫形参,而真正在使用一个函数时,比如上图中第17行,我们是把main函数中两个实际的变量apple_price和banana_price传递给函数参与运算的。这个两个变量apple_price和banana_price叫做函数的实际参数,简称实参。

下面再举个例子看一下:

2371bedd27857298d220433db6a7bf81.png

上图中函数的形参是一个int数组和一个int变量,在第18行调用这个函数时传入的实参分别是数组myarray和表示数组长度的数据5。

3.形参的默认值

函数的形参都可以有一个默认值。所谓默认值就是函数在声明形参的同时保存在其中的一个数据值。形参的默认值一直保持不变,直到函数的使用者传入一个新数据时才会改变。如下图中的两个函数在声明的时候都给每个形参赋予一个默认值。

调用函数时,你可以有两个选择:让形参以默认值参与运算,或传入一个新的实参。如果你传入一个新的实参,那函数就以新的实参数据参与函数运算。

c8da6430468eb715cd26f573c3e81892.png

11.2 返回值类型

1.有返回值

通过对函数的结构的了解,我们知道执行函数是可以产生一个结果的,这个结果叫函数的返回值。

如果你决定让一个函数返回一个结果,那么在声明函数时就声明这个函数返回值的类型,就像上图中第14行,计算一个数的N次方,并返回一个int类型的数据值。

2.无返回值

函数也可以不返回任何结果。比如在printArray函数中,函数体中将参数数组的元素输出在屏幕上,但是这个函数并没有任何结果返回。当声明一个函数没有返回值时,我们必须在函数名前面写上void。void意思就是一个函数没有返回值。

11.3 函数重载

如果有这样一组数学函数要你用代码写出来:

计算两个int整型数据的和;计算两个float浮点型(小数类型)数据的和;计算两个double浮点型型数据的和;

你是否要给每一个函数一个不同的名字呢?答案是不必须的。我们完全可以让这组函数拥有相同的函数名。

d13fcb497bb7ba1adc80f35d542d0461.png

上图中三个函数都有相同的名字add,但是函数的参数类型却完全不同。

如果函数的名字相同,参数的类型或数量不同,那这一组函数就构成了函数的重载。有了重载这个武器,你以后再也不用绞尽脑汁的去给函数起名字了。

11.4 函数模板

函数的重载已经帮了我们大忙了,但是要把所有类型的加法函数都写出来也很折磨人,更别提还有减法、乘法了,这简直是伤心病狂的要求。

还好C++ 有一神器可用:模板函数。模板函数就像一个老母鸡一样,可以孵化出来不同的函数。

29edd8650c634d8653c36f27f45d5e61.png

声明一个模板函数十分的简单、有趣,函数头前面只要添加一行代码就可以声明模板函数了。

template 英文含义:模板。用来声明函数是模板。 这里的class 表明T的身份是一个数据类型,而T泛指某一种具体的数据类型。

我们可以看到T 可以出现在函数的形参类型或返回值类型的位置上,因为T就是形参或返回值的类型。只不过T的类型现在并不确定,可以有很多变化,可以是int也可以是任意其他合理的类型。

只有在main函数中实际使用这个函数时,编译器才会依据传入的实参类型推断出T真正的类型,然后生成一个具体的函数实体。

模板中的参数类型可以有多个,V和T一样只是一种代号,你可以换成别的名字M或N等等。

模板函数的强大威力相信你已经从上面的例子中感受到了:模板函数中的数据类型真是变化莫测。

不知道你有没有发现,上面例子中两个模板函数之间也是一种重载关系!怎么样,你是否认为值得花点时间研究一下这些内容呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值