4.C++函数提高

1 函数默认参数

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

例如

我们在使用默认参数时,实参是可以覆盖默认参数的值。void wow(int n=1)中的n设为默认值1,函数调用wow(2)还是相当于相当于wow(2)。

默认参数注意事项:

1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
2. 如果函数声明有默认值,函数实现的时候就不能有默认参数

以上述代码为例,int func(int a,int b=10,int c=10) ;是正确的,int int func(int a,int b=10,int c)就是错误的。因为c在b的右边,如果b有默认值的话,c也要有默认值。

如果函数声明是由默认值,函数实现时就不能由默认参数。否则就会报错。

函数默认参数的一个应用。

//假设有一个函数left(),它将字符串和n作为参数,并返回该字符串的前n个字符。

const int ArSize = 80;

char* left(const char* str, int n=1)
{
	if (n < 0)
		n = 0;//如果n<0,返回NULL
	char* p = new char[n + 1];//比返回的字符串的长度多1,为了加入'\0';
	int i;
	for (i = 0; i < n&&str[i]; i++)//复制n个字符循环结束,或者遇到空字符循环结束。
	{
		p[i] = str[i];
	}
	while (i <= n)
		p[++i] = '\0';
	return p;
}
int main()
{
	char example[ArSize];
	//cin.get(char类型变量数组,最大读取数量)
	//这个可以从输入流当中读取的字符串,不可以超过固定的最大读取数量
	cout << "请输入一个字符串: " << endl;
	cin.get(example, ArSize);
	char* ps = left(example, 4);
	cout << ps << endl;
	//释放new开辟的空间
	//delete[] ps;

	ps = left(example);//默认参数
	cout << ps << endl;
	//释放new开辟的空间
	//delete[] ps;
	return 0;
}

 

2 函数占位参数

C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置。

//函数占位参数 ,占位参数也可以有默认参数
void func(int a, int) {
	cout << "this is func" << endl;
}

int main() {

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

	system("pause");

	return 0;
}

 

3 函数重载

        函数重载就像是有多种含义的动词,就好比Piggy小姐可以在棒球场对球(root),也可以在地里种植(root)作物。我们可以通过上下文来确定root的含义。

        函数重载的关键在于函数的参数列表,函数参数类型不同 或者 个数不同 或者 顺序不同时可以进行函数重载。

总结:

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

  • 同一个作用域下

  • 函数名称相同

  • 函数参数类型不同 或者 个数不同 或者 顺序不同

注意: 函数的返回值不可以作为函数重载的条件  

//函数重载需要函数都在同一个作用域下
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;
}

 

我们可以从结果中清晰的看到,输入参数不同会调用不同的函数。

4 函数重载注意事项

4.1 引用作为重载条件

第一种情况:

int  func(int a);

int  func(int &a);

虽然以上两个函数的形参列表看上去不同,但是如果我们从编译器的角度来思考问题,假设是下面的代码:

cout<<func(x);

参数x和int a原型和 int &a原型都能匹配,因此编译器无法确定应使用哪一个原型。

 第二种情况:

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);
	func(10);
	return 0;
}

4.2 函数重载碰到函数默认参数 

碰到默认参数产生歧义,需要避免。这是因为此时的编译器不知道func(10),10是赋值给func(int a,int b=10),还是给func(int a)。这时就会产生歧义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值