C++之函数高级

C++中函数可以拓展出默认参数、占位参数和重载,其中重载在C++中具有重要意义。

一、函数默认参数

C++中函数形参可以有默认值,但要遵守一定规则。如果某个位置参数有默认值,那么从这个位置往后都必须有默认值。如果函数声明中有默认值,函数实现的时候就不能有默认参数。

最好将默认值设置在函数声明中,避免跨文件调用时报错。

//add1.h

#include<iostream>
using namespace std;

int add1(int x, int y, int z);



//add1.cpp

#include"add1.h"

int add1(int x, int y = 2, int z = 3)
{
	return x + y + z;
}



//add2.h

#include<iostream>
using namespace std;

int add2(int x, int y = 2, int z = 3);



//add2.cpp

#include"add2.h"

int add2(int x, int y, int z)
{
	return x + y + z;
}



//main.cpp

#include"add1.h"
#include"add2.h"

int main()
{
	//此处会显示“函数调用的参数太少”
	//cout << "sum = " << add1(1) << endl;
	cout << " sum = " << add1(10, 20, 30) << endl << endl;

	cout << " sum = " << add2(1) << endl;
	cout << " sum = " << add2(10, 20, 30) << endl;

	return 0;
}

二、函数占位参数

函数的形参列表里可以有占位参数,对其仅设置数据类型而不赋予形参名,但在调用函数时该位置必须有实参。

占位参数也可以设置默认值,若其有默认值,则调用函数时该位置可以无实参。

三、函数重载

函数名可以相同,提高复用性。

1.函数重载条件

即区分函数名相同函数的条件,可以是函数参数类型、个数或顺序不同。函数返回值类型不同不可以作为函数重载条件。

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;
//	return 1;
//}

int main()
{
	func(10);
	func(3.14);
	func(10, 3.14);
	
	func(3.14, 10);

	return 0;
}

2.函数重载与引用

引用和常量引用也可以作为函数重载条件。

//若用func(x)调用该函数,即为“int& a = x;”,合法
//若用func(1)调用该函数,即为“int& a = 1;”,不合法
void func(int& a)
{
	cout << "func (int &a) 调用 " << endl;
}
//用func(x)和func(1)调用该函数,即“const int& a = x;”和“const int& a = 1;”,均合法
void func(const int& a)
{
	cout << "func (const int &a) 调用 " << endl;
}

int main()
{

	int x = 1;

	//func(x)优先调用函数func(int& a),当不存在函数func(int& a)时,调用函数func(const int& a)
	//func(1)只能调用函数func(const int& a)
	func(x); 
	func(1);

	return 0;
}

 3.函数重载和默认参数

若要使某函数重载,则尽量不要给该函数设置默认参数。

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

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

int main()
{
	//该行代码可正常执行,无歧义,只有函数func(int a, int b = 2)可被其调用
	func(1, 2);

	//该行代码无法正常执行,有歧义,函数func(int a)和函数func(int a, int b = 2)均可被其调用
	//报错显示“有多个重载函数func实例与参数列表匹配”
	//func(1);

	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值