c++基础(二)函数的高级用法

函数的默认参数

在函数的形参列表中的形参可以用默认值
用法:返回值类型 函数名(参数类型 参数名 = 默认值){}
下面举个栗子:

int demo(int a = 1, int b = 2) 
{
    
    
	return a + b;
}
int c = demo();
cout << "c = " << c << endl;

输出:

c = 3

当我们在调用函数时我们指定相关变量的数值,则在函数中会使用我们指定的数值,而非默认数值。如果没有指定相关的数值,在调用函数时会使用默认数值。栗子如下:

int demo(int a = 1, int b = 2) 
{
    
    
	return a + b;
}
int a = 10;
int b = 20;
int c = demo(a, b);
cout << "c = " << c << endl;
int d = 30;
int e = demo(a = d);
cout << "c = " << e << endl;
c = 30
c = 32

函数中的占位参数

在函数的形参列表中,我们可以设置一个占位参数,用来进行占位,但是在调用函数时必须对占位进行补充。占位参数也可以有默认参数。
语法:返回值类型 函数名(数据类型){}
举个栗子:

int demo03(int a, int)
{
    
    
	return a;
}
int a = 10;
int b = 20;
int e = demo03(a, b);
cout << "c = " << e << endl;

输出为:

c = 10

如果某个位置已经有了默认参数,那么从这个位置开始,这个位置及这个位置右侧的所有变量都要有默认值

int demo(int a = 1, int b = 2, int c) //这种语法即为错误使用,此时会报错默认实参不在形参列表的结尾
int demo(int a = 1, int b = 2, int c = 3)//此为正确语法

函数的声明和实现只能有一个有默认参数,不能同时拥有

int demo01(int a = 1, int b = 2); // 函数的声明

int demo01(int a = 1, int b = 2) //函数的实现。 此时会报错,“demo01”: 重定义默认参数
{
    
    
	return a + b;
}

函数重载

函数重载要满足的三个条件:
1、同一作用域下;
2、函数名称相同;
3、函数参数的类型不同或者个数不同或者顺序不同。
作用:函数名可以相同,提高复用性。
举个栗子如下:

#include<iostream>
using namespace std;
//1、两个example函数都在全局作用域下
//2、两个example函数的名称相同
//3、两个example函数的参数的个数不同
void example() 
{
    
    
	cout << "这是一个例子" << endl;
}


void example(int a)
{
    
    
	cout << "这是另外一个栗子" << a << endl;
}

int main() {
    
    

	example();

	system("pause");
	return 0;
}

输出结果为

这是一个例子

以上两个example函数的作用域都处在全局作用域下,满足了条件一;
以上两个example函数的函数名称相同,满足了条件二;
以上两个example函数的参数个数不同,满足了条件三;
三个条件均都满足了,所以以上两个函数属于函数重载。当我们在主函数调用函数时,我们可以通过函数的参数个数或者参数的类型或者顺序来决定调用哪一个函数。
函数的返回值不同不可以作为函数重用的条件
举个栗子:

void example(int a)
{
    
    
	cout << "这是另外一个栗子" << a << endl;
}


int example(int a)
{
    
    
	cout << "这是另外一个栗子" << a << endl;
}

此时会报错:

无法重载仅按返回类型区分的函数

原因是,当我们调用以上两个函数时,我们不能通过返回值来区分来调用哪个函数。这样就会报错了。

函数重载的注意事项

1、引用作为函数重载的条件

#include<iostream>
using namespace std;

void example(int &a) 
{
    
    
	cout << "这是一个栗子" << a << endl;
}

void example(const int &a)
{
    
    
	cout << "const 这是一个栗子" << a << endl;
}


int main() {
    
    

	//调用第一个函数
	int a = 10;
	example(a);
	//调用第二个函数
	example(10);

	system("pause");
	return 0;

这里给出了两个可以重载的函数,当我们调用第一个函数时我们输入一个可读可写的变量a,但是const限制了写的操作,只能进行变量的读取。所以对第一个函数进行了调用;当我们输入了一个常量时,它并不是一个合法的内存空间(它在一个常量区,而非栈区或堆区),所以不能通过引用进行调用,也就是第一个函数不能调用的原因,当我们通过const对引用进行修饰时,第二个函数传参是变为了,const int &a = 10。也就是变为了一个常量引用
所以会调用第二个函数。
2、函数的重载碰到了默认参数
先举个栗子:

void example01(int a, int b = 1)
{
    
    
	cout << "const 这是一个栗子" << a << endl;
}


void example01(int a)
{
    
    
	cout << "const 这是一个栗子" << a << endl;
}

int a = 10;
int b = 20;
example01(a);//此时会报错:有多个 重载函数 "example01" 实例与参数列表匹配
example01(a, b);//这时候就不会报错了

此时会报错:


主要原因是当一个函数有默认参数时,我们在调用这一个函数时,我们可以不传递默认参数的实参。当不传递默认参数时,我们的编译器就不知道要调用哪一个函数了。我们可以在调用这种重载函数时,我们可以指定默认参数的数值来解决这一问题。

猜你喜欢

转载自blog.csdn.net/qq_52302919/article/details/123739362