【c++】c++入门(二)缺省参数、函数重载的介绍与使用

小编个人主页详情<—请点击
小编个人gitee代码仓库<—请点击
c++系列专栏<—请点击
倘若命中无此运,孤身亦可登昆仑,送给屏幕面前的读者朋友们和小编自己!
在这里插入图片描述



一、缺省参数

1.概念讲解

缺省参数是声明或定义函数时为函数的参数指定一个缺省值,在调用函数的时候,如果没有指定实参,那么就采用形参的缺省值,否则采用指定的实参

  1. 当我们调用Func的时候没有传实参,那么打印a就是采用的形参a的缺省参数0去打印的,如果我们指定的实参1,那么a的值就为我们指定的实参1,打印a的结果为1
#include <iostream>

using namespace std;

void Func(int a = 0)
{
    
    
	cout << a << endl;
}

int main()
{
    
    
	Func();
	Func(1);

	return 0;
}

结果如下
在这里插入图片描述

2.缺省参数的分类

  1. 缺省参数又被称为默认参数
  2. 缺省参数分为全缺省参数和半缺省参数
2.1全缺省参数
  1. 即函数的每一个形参都有对应的缺省值,我们在调用的时候可以不指定实参,也可以指定一个实参,也可以全部都指定实参
void Func(int a = 0,int b = 1,int c = 2)
{
    
    
	cout << a << endl;
	cout << b << endl;
	cout << c << endl<<endl;
}

int main()
{
    
    
	Func();
	Func(11);
	Func(11,22);
	Func(11,22,33);

	return 0;
}

在这里插入图片描述

  1. 但是我们在指定实参的时候只能默认从最左边开始进行指定实参,不可以使用,逗号进行间隔传参
int main()
{
    
    
	Func(, 22, 33);

	return 0;
}

结果如下
在这里插入图片描述

2.2半缺省参数
  1. 即函数的参数从右边开始向左边给缺省值,不能间隔给缺省值
  2. 半缺省并不是指函数的参数的缺省值有一半没有给值,而是指从函数参数最左边开始至少有一个没有给缺省值,从最右边开始至少有一个参数给了缺省值
void Func(int a, int b = 1, int c = 2)
{
    
    
	cout << a << endl;
	cout << b << endl;
	cout << c << endl << endl;
}

int main()
{
    
    
	Func(0);
	Func(0,11);
	Func(0,11,22);

	return 0;
}

结果如下
在这里插入图片描述

  1. 半缺省函数在定义或声明的时候关于形参的缺省值不能间隔着给,否则出现编译错误

结果如下
在这里插入图片描述

  1. 半缺省函数在调用的时候必须给没有指定缺省值的参数指定对应的实参才能进行调用
int main()
{
    
    
	Func();

	return 0;
}

结果如下
在这里插入图片描述

  1. 缺省参数只允许在函数的声明和定义中存在一个,如果同时存在,那么编译器会不知道究竟是使用函数声明的缺省值还是使用函数定义的缺省值,即编译器会显示重定义默认参数报错
//test.h
void Func(int a = 1);

//test.c
#include "test.h"

void Func(int a = 0)
{
    
    
	cout << a << endl;
}

int main()
{
    
    
	Func();

	return 0;
}

在这里插入图片描述

  1. 缺省值在进行多文件管理,存在专门放置声明和定义的两个文件时候,存在一个函数要使用缺省参数,那么这个缺省参数的缺省值必须放到函数声明中,不能放在函数定义中
    在这里插入图片描述
//Fun.cpp
#include "test.h"

void Func(int a = 1,int b=1)
{
    
    
	cout << a << b << endl;
}

//test.h
void Func(int a,int b);

//test.c
#include "test.h"

int main()
{
    
    
	Func();

	return 0;
}

在这里插入图片描述

  1. 必须要将缺省参数放到声明中
    在这里插入图片描述
//Fun.cpp
#include "test.h"

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

//test.h
void Func(int a = 1,int b = 2);

//test.c
#include "test.h"

int main()
{
    
    
	Func();

	return 0;
}

在这里插入图片描述

  1. 当是单文件的时候函数定义直接给缺省值即可进行调用
#include <iostream>

using namespace std;

void Func(int a = 1, int b = 2)
{
    
    
	cout << a << b << endl;
}

int main()
{
    
    
	Func();

	return 0;
}

在这里插入图片描述

二、函数重载

1.概念讲解

函数重载是函数的一种特殊情况,c++允许在同一作用域中声明功能类似的同名函数,这些函数的形参列表(参数个数,类型,类型顺序)不同,常用来处理功能相同数据类型不同的问题

  1. 函数重载与函数的返回值类型无关
1.1参数个数不同
void Func(int a)
{
    
    
	cout << a << endl;
}

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

void Func(int a, int b, int c)
{
    
    
	cout << a << b << c << endl;
}

int main()
{
    
    
	Func(1);
	Func(1,2);
	Func(1,2,3);

	return 0;
}

在这里插入图片描述

1.2参数类型不同
void Func(int a,int b)
{
    
    
	cout << a << b << endl;
}

void Func(double a, double b)
{
    
    
	cout << a << b << endl;
}

int main()
{
    
    
	Func(1, 2);
	Func(1.1, 2.2);

	return 0;
}

在这里插入图片描述

1.3参数类型顺序不同
void Func(int a, double b)
{
    
    
	cout << a << b << endl;
}

void Func(double a, int b)
{
    
    
	cout << a << b << endl;
}

int main()
{
    
    
	Func(1, 2.2);
	Func(1.1, 2);

	return 0;
}

在这里插入图片描述

2.调用不明确

  1. 当读者友友们在使用的时候不可以进行下面这种方式进行调用
  2. 虽然语法上符合函数重载不构成重命名,但是这样当你使用Func()进行调用的时候,第一个Func()函数进行调用的时候不需要传参,第二个Func()进行调用的时候,由于缺省参数的存在使得它也不要传参,调用的时候使用函数的缺省值0为a赋值
  3. 这样当我们在main函数内调用Func()进行调用的时候会有两个函数可以进行调用,那么这时候不会出现重定义因为它符合函数重载的语法规则,但是一旦进行调用就会出现函数调用不明确的问题
void Func()
{
    
    
	cout << "Func()" << endl;
}

void Func(int a = 0)
{
    
    
	cout << "Func(int a = 0)" << endl;
}

int main()
{
    
    
	Func();

	return 0;
}

在这里插入图片描述

3.为什么c++支持函数重载,c语言不支持

c/c++的预处理、编译、汇编、链接过程
详情请点击<—

  1. 对于c语言来说,它在进行函数调用函数名的时候以Func函数为例,gcc编译器会将Func函数名直接拿来使用,如果此时函数内部有多个重名的Func,编译器不知道要进行调用哪一个Func函数
  2. c++的函数名修饰规则独特,根据函数参数的不同修饰出来不同的函数名进行调用,例如有void Func(int a=0,int b=1),linux中的g++编译器会将这个函数名修饰成_Z4Funcii,举例void Func(int a=0,double b=1),linux中的g++编译器会将这个函数名修饰成_Z4Funcid,这样在函数调用的时候编译器根据参数的类型就能自动识别出要进行调用哪一个函数,所以c++支持函数重载,c语言不支持函数重载

总结

以上就是今天的博客内容啦,希望对读者朋友们有帮助
水滴石穿,坚持就是胜利,读者朋友们可以点个关注
点赞收藏加关注,找到小编不迷路!