函数重载、缺省参数、内联函数都是C++不同于C语言的知识点,简单轻松,这里就放到一篇来讲——
目录
1.缺省参数
1.1什么是缺省参数?
1.2为什么需要缺省参数?
1.3缺省参数的使用规则
2.函数重载
参数类型不同:
参数个数不同:
参数顺序不同:
函数重载中存在缺省参数时:
3.内联函数
3.1内联函数的优点
3.2内联函数的写法
1.缺省参数
1.1什么是缺省参数?
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参 则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把 缺省参数也叫默认参数)
1.2为什么需要缺省参数?
在实际生活中,使用函数的人有时不知道需要传什么样的值给函数,那缺省参数就解决了这一点,创造函数的人清楚函数的具体用法,可以先给出一个较好的参数,等使用函数的人清楚这个函数而想要传参时,就可以传使用者的参数啦
就比如说在栈开辟时,可以给不知道开辟多少个容量的人规定开辟4个整型大小的空间
void STInit(ST* ps, int n = 4)
{
assert(ps && n > 0);
ps->a = (STDataType*)malloc(n * sizeof(STDataType));
ps->top = 0;
ps->capacity = n;
}
1.3缺省参数的使用规则
- 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。
- 带缺省参数的函数调用,C++规定必须从左到右依次传实参,不能跳跃传实参。
- 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。 一般情况下我们喜欢在声明的时候给缺省值。
举例如下:
#include <iostream>
using namespace std;
// 全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
// 半缺省
void Func2(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func1();
Func1(1);
Func1(1, 2);
Func1(1, 2, 3);
Func2(4);
Func2(4, 5);
Func2(4, 5, 6);
return 0;
}
上述代码运行如下:
2.函数重载
函数重载就是几个函数拥有同一个函数名,但是他们的参数类型不能全部相同
C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的。
下面以举例来分析——
参数类型不同:
// 参数类型不同
int Add(int a, int b)
{
cout << "int Add(int a, int b)" << endl;
return a + b;
}
double Add(double a, double b)
{
cout << "double Add(double a, double b)" << endl;
return a + b;
}
int main()
{
Add(10, 20);
Add(10.1, 20.2);
return 0;
}
参数个数不同:
// 参数个数不同
void Add(int a, int b)
{
cout << "Add(int a, int b)" << endl;
return a + b;
}
void Add(int a, int b, int c)
{
cout << "Add(int a, int b, int c)" << endl;
return a + b + c;
}
int main()
{
Add(10, 20);
Add(10, 20, 30);
return 0;
}
参数顺序不同:
// 3、参数类型顺序不同
void fun(int a, char b)
{
cout << "fun(int a,char b)" << endl;
}
void fun(char b, int a)
{
cout << "fun(char b, int a)" << endl;
}
int main()
{
fun(10, 'a');
fun('a', 10);
return 0;
}
函数重载中存在缺省参数时:
void f1()
{
cout << "f()" << endl;
}
void f1(int a = 10)
{
cout << "f(int a)" << endl;
}
int main()
{
f1()
f1(100);
return 0;
}
这个程序就会报错,因为f1()存在歧义,编译器不知道调用哪个函数
3.内联函数
3.1内联函数的优点
- 用inline修饰的函数叫做内联函数,编译时C++编译器会在调用的地方展开内联函数,这样调用内联函数就不需要建立栈帧了,就可以提高效率。
- C语言实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不方便调 试,C++设计了inline目的就是替代C的宏函数。
3.2内联函数的写法
内联函数就是在函数前面+inline
举例如下:
inline int Add(int x, int y)
{
int ret = x + y;
return ret;
}
- inline对于编译器而言只是一个建议,也就是说,你加了inline编译器也可以选择在调用的地方不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。
- inline适用于频繁调用的短小函数,对于递归函数,代码相对多一些的函数,加上inline也会被编译器忽略。
vs编译器 debug版本下面默认是不展开inline的,这样方便调试,debug版本想展开需要设置一下 以下两个地方。
inline不建议声明和定义分离到两个文件,分离会导致链接错误。因为inline被展开,就没有函数地 址,链接时会出现报错。
---------------------------------------------------------------------------------------------------------------------------------
好啦,函数重载、缺省参数和内联函数就先讲到这里啦,有疑问的伙伴欢迎在评论区交流~
喜欢的小伙伴请留下你宝贵的三连吧~