学好C++之——函数重载、缺省参数、内联函数

函数重载、缺省参数、内联函数都是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被展开,就没有函数地 址,链接时会出现报错。 

---------------------------------------------------------------------------------------------------------------------------------

好啦,函数重载、缺省参数和内联函数就先讲到这里啦,有疑问的伙伴欢迎在评论区交流~

喜欢的小伙伴请留下你宝贵的三连吧~

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值