C++学习笔记:默认参数、占位参数、函数重载


一、默认参数

默认参数指的是当函数调用中省略了实参时自动使用的一个值。例如,如果将void func(int n)设置成n有默认值为1,则函数调用func()相当于调用了func(1)。

1、使用方法

默认参数常见语法为:返回值类型 函数名(参数=默认值){函数体}
示例代码如下:

int func(int a, int b = 10, int c = 10) {
	return a + b + c;
}
int main() {

	cout << "ret = " << func(100) << endl;

	system("pause");

	return 0;
}

程序运行结果如下:
在这里插入图片描述
显然,该结果为:a + b + c = 100 + 10 + 10 = 120。当我们对默认参数传递指定值时,参数值会更改为我们指定的值,例如:

int func(int a, int b = 10, int c = 10) {
	return a + b + c;
}
int main() {

	cout << "ret = " << func(100,20) << endl;

	system("pause");

	return 0;
}

程序运行结果如下:
在这里插入图片描述
显然,该结果为:a + b + c = 100 + 20 + 10 = 130。

2、注意事项

(1)如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值。即默认参数应当放置在最右侧。如int func(int a, int b = 10, int c = 10),而int func(int a = 5, int b, int c = 10)为错误语法。
(2)如果函数声明和函数实现时都有默认值,默认值需要对应相等。示例代码如下:

int func2(int a = 10, int b = 20);
int func2(int a = 15, int b = 20) {
	return a + b;
}

上述代码中,函数声明int func2(int a = 10, int b = 20)中a的默认值为10,但是在函数实现时参数a的默认值为15,该语法是错误的,编译无法通过。


二、函数占位参数

C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置。
占位参数的语法为:返回值类型 函数名 (数据类型){函数体}
示例代码如下:

void func(int a, int) {
	cout << "this is func" << endl;
}

int main() {

	func(10,10); //占位参数必须填补

	system("pause");

	return 0;
}

程序运行结果如下:
在这里插入图片描述
占位参数同样可以有默认参数,示例代码如下:

void func(int a, int = 10) {
	cout << "this is func" << endl;
}

int main() {

	func(10);   //此时占位参数具有默认值,无需填补

	system("pause");

	return 0;
}

程序运行结果如下:
在这里插入图片描述


三、函数重载

函数多态是C++在C语言的基础上新增的功能。默认参数让我们能够使用不同的参数调用同一个函数,而函数重载让我们能够使用多个同名的函数。函数重载也可以称为函数多态。

1、使用方法

函数重载需要满足以下条件:

  • 同一作用域下
  • 函数名称相同
  • 函数参数类型不同或者个数不同或者顺序不同
    对于第一点,代码示例如下:
void func(int a) {
	cout << "func(int a)" << endl;
}

void func(int a, int b) {
	cout << "func(int a, int b)" << endl;
}

void getFunc() {
	void func(int a, int b, int c);
	func(1);
	func(1, 2);
}

int main() {

	getFunc(); //占位参数必须填补

	system("pause");

	return 0;
}

在上述代码中,void func(int a)、void func(int a, int b)与void func(int a, int b, int c);并不在同一作用域中,因为在getFunc()函数内部定义了void func(int a, int b, int c),因此在getFunc()中调用func函数需要按照void func(int a, int b, int c)来输入参数,编译器中对上述代码的报错提示如下:
在这里插入图片描述
函数重载的示例代码如下:

//函数重载需要函数都在同一个作用域下
void func()
{
	cout << "func 的调用!" << endl;
}
void func(int a)
{
	cout << "func (int a) 的调用!" << endl;
}
void func(double a)
{
	cout << "func (double a)的调用!" << endl;
}
void func(int a ,double b)
{
	cout << "func (int a ,double b) 的调用!" << endl;
}
void func(double a ,int b)
{
	cout << "func (double a ,int b)的调用!" << endl;
}

//函数返回值不可以作为函数重载条件
//int func(double a, int b)
//{
//	cout << "func (double a ,int b)的调用!" << endl;
//}


int main() {

	func();
	func(10);
	func(3.14);
	func(10,3.14);
	func(3.14 , 10);
	
	system("pause");

	return 0;
}

代码运行结果如下所示:
在这里插入图片描述
可以看出,调用过程中会根据输入参数的不同,选择对应函数进行调用。

2、注意事项

(1)引用和常量引用的重载
示例代码如下:

void func(int &a)
{
	cout << "func (int &a) 调用 " << endl;
}

void func(const int &a)
{
	cout << "func (const int &a) 调用 " << endl;
}
int main() {
	
	int a = 10;
	func(a); //调用无const
	func(10);//调用有const


	//func2(10); //碰到默认参数产生歧义,需要避免

	system("pause");

	return 0;
}	

上述代码中,调用void func(int &a),需要的语法为func(a),当调用void func(const int &a)时,需要使用语法func(10),因为对于const int &a = 10,编译器会优化代码为 int temp = 10;const int& ref = temp;但是int& a = 10并不符合语法规则,因此func(10)调用的是void func(const int &a)。
(2)函数重载应当避免默认参数产生的歧义
示例代码如下:

void func2(int a, int b = 10)
{
	cout << "func2(int a, int b = 10) 调用" << endl;
}

void func2(int a)
{
	cout << "func2(int a) 调用" << endl;
}

int main() {
	
	func2(10); //碰到默认参数产生歧义,需要避免

	system("pause");

	return 0;
}

对于func2(10)他同时满足void func2(int a, int b = 10)和void func2(int a)的调用规则,此时编译器会报错,因此在函数重载时,需要避免默认参数产生的歧义。
(3)不能重载仅按返回类型区分的函数,如int func(int a);void func(int a);
示例代码如下:

void func(int a)
{
	cout << "void func 的调用!" << endl;
}

int func(int a)
{
	cout << "int func 的调用!" << endl;
	return 0;
}

上述代码的func函数仅仅是返回类型不同,因此不能重载,编译器报错如下:
在这里插入图片描述
但是若对输入参数进行更改,程序能正常运行,如:

void func(int a)
{
	cout << "void func 的调用!" << endl;
}

int func(int a,int b)
{
	cout << "int func 的调用!" << endl;
	return 0;
}
int main() {
	
	func(10); 
	func(10,10); 

	system("pause");

	return 0;
}

程序运行结果如下:
在这里插入图片描述

参考

视频《黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难》
书籍《C++ Primer Plus》(第六版)
csdn文章:https://blog.csdn.net/Peter_Red_Boy/article/details/90116361

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值