函数(内联函数、带有默认值的函数、重载函数)

函数原型:

我们知道无论什么编程语言都有函数,函数就是对一段程序的封装,这段程序可以实现某种功能,我们使用函数进行包装,然后在需要这个功能的时候调用这个函数,函数可以使你的代码更加简洁,也增加了代码的可读性,也便于你调试,尤其是你的程序中需要多次使用这个函数的时候,函数的优点就更加明显。
函数的结构为:

返回值类型 函数名(参数表){
    函数体;
}

并且在C/C++中,如果函数调用的位置在函数定义之前,则要求在函数调用之前必须对所调用的函数作为函数原型的声明,以说明函数的名称、参数类型与个数,以及函数返回值的类型。
函数原型的语法一般为(C/C++为例):

返回值类型  函数名(参数表);///分号结束,分号不能少

说明:

  1. 函数原型的参数表中可不包含参数的名字,而只包含它们的类型。(不建议)
  2. 函数定义有函数说明和函数体两个部分构成。函数说明部分与函数原型基本一样,但函数说明部分中的参数必须给出参数的名字,而且不能包含结尾的分号。
  3. 主函数main不必进行原型说明,因为它被看成一个自动说明原型的函数。主函数是第一个被执行的函数,而且不存在被别的函数调用的问题。
  4. 原型说明中没有指出返回类型的函数(包括主函数),C++默认该函数的返回类型是int。标准C++要求main函数必须声明为int型,而不能是void。
  5. 如果一个函数没有返回值,则必须在函数原型中注明返回类型为void,这时函数中就不必有return语句了。
  6. 如果函数原型中为注明参数,C++假定该函数的参数表为空(void)。例如:
 f();
 f(void);

C++中这两个原型说明是相同的,都表示该函数不带有任何参数,但是在C中是不同的:

f(void);///表示不带有参数
f();///表示该函数的参数信息没有给出,它可能带有参数

内联函数:

在函数说明前以关键字"inline",该函数就被声明为内联函数,又称内置函数。每当程序中出现对该函数的调用时,C++编译器使用函数体中的代码插入到调用该函数的语句处,同时使用实参代替形参(意思是将函数参数声明成实参),以便在程序运行时不再进行函数调用。
例如:

#include<iostream>
using namespace std;
inline int add(int x, int y, int z) {
	x += 1;
	return x + y + z;
}

int main() {
	int a = 1, b = 2, c = 3;
	cout << add(a, b, c) << endl;
	cout << "a=" << a << endl;
	return 0;
}

结果:
在这里插入图片描述
由于在定义函数add时指定它为内联函数,因此编译系统在遇到函数调用的时候,就用add函数体的代码代替add(x,y,z),同时将实参代替形参,这样,“v=add(a,b,c)”就被置换成了:

{
  int x=a;
  int y=b;
  int z=c;
  x+=1;
  v=x+y+z;
}

这样有什么好处呢?这主要是为了消除函数调用时的系统开销,以提高运行速度。在程序执行过程中调用函数时,系统要将程序当前的一些状态信息存到栈中,同时转到函数的代码处去执行函数体语句,这些参数的保存与传递的过程需要时间和空间的开销,使得程序的执行效率较低。因此可以使用内联函数。
说明:

  1. 内联函数在第一次被调用之前必须进行完整的定义,否则编译器不知道应该插入什么代码。
  2. 在内联函数体内不能含有复杂的控制语句:如for语句和switch语句。
  3. 通常只有小规模(一般为1~5条语句)而使用频繁的函数才定义为内联函数,否则会使代码加长很多,增大开销。
  4. C++的内联函数与C中的带参宏定义#define有些相似,但不完全相同。宏定义是在编译前由预编译程序对其预处理,只进行字符替换,可能会出现意想不到的错误,使用内联函数代替宏定义可以消除宏定义的不安全性。

带有默认参数的函数

在C++中调用函数时可以传递的参数小于函数声明中的参数表,但是函数的参数表中没有传递的参数必须带有默认参数。例如:

int add(int x,int y,int z,int i=1,int y=2);

在调用的时候:

add(1,2,3);

首先带有默认值的参数必须放到不指定默认值的参数的右边,因为只有这样才能保证传参的时候不指定默认值的参数一定有值,就例如上面的add(1,2);如果只传两个参数这样是不对的,不指定默认值的参数必须要有传参,并且,如果指定的默认值也进行了传参,那么传的值将覆盖默认值,例如add(1,2,3,4);那么函数体内i=4,而不是默认值1。
如果函数的定义在函数调用之前,则应在函数定义中指定默认值。如果函数的定义在函数调用之后,则函数调用之前需要有函数声明,此时必须在函数声明中给出默认值,在函数定义时则不再需要给出默认值了。

函数的重载

函数的重载就是两个以上的函数使用相同的函数名,这就是函数的重载,被重载的函数称为重载函数。该如何区分重载函数呢?计算机该如何知道调用哪个重载函数呢?根据参数表,不同的重载函数它们的主要区别就是参数表的个数不同、参数表的类型不同。给返回值无关。例如:

int add(int x,int y);
double add(double x,double y);
int add(int x,int t,int z);

说明:

  1. 调用重载函数时,函数返回值不在参数匹配检查之列。因此,若两个函数的参数数个数和类型都相同,而只有返回值不同,则不允许重载。
  2. 函数的重载不和带默认值的函数连用,可能会产生二义性,不能区分参数个数,因为你调用的时候,虽然只有一个参数,但是如果有默认值的话,无法做出区分。
  3. 在函数调用时,如果给出的实参和形参类型不相符时,C++编译器会自动做出类型转换,但是如果和函数重载连用的时候,并且重载函数的区别是参数的类型,有可能会产生不可识别的错误,编译器不知道该转化成什么类型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赟家小菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值