C++缺省参数与重载函数(超详细!)

 更新时间:2024年06月13日 09:42:21   作者:玛丽亚后  
无论使用什么语言函数都是代码段中必不可少的部分,因此我们有必要深入认识一下C++中函数的两种特殊用法,缺省参数,函数重载,这篇文章主要给大家介绍了关于C++缺省参数与重载函数的相关资料,需要的朋友可以参考下

本篇文章主要讲述c++中有关于缺少参数与函数重载的相关概念与实例,以下是本人拙见,如有错误敬请指教。

一.缺省参数

1.1缺省参数概念

缺省参数就是声明和定义函数时为函数的参数指定一个缺省值

简而言之就是应对没有传实参时的一种保底手段,若没有传实参缺省参数就会用自己的初始化数值,传实参则用实参的值忽略缺省值。

#include <iostream>
using namespace std;
void fun(int a = 0)
{
	cout << a << endl;
}

int main()
{
	int a = 1;
	fun();
	fun(a);
	return 0;
}

1.2缺省参数分类

  • 全缺省参数

顾名思义,对所有形参进行初始化

void fun(int a = 0,int b = 0,int c= 0)
{
	cout << a << b << c << endl;
}
int main()
{
	int a = 1;
	int b = 2;
	int c = 3;
	fun();
	fun(a, b, c);
	return 0;
}

  • 半缺省参数

对一部分形参进行初始化

void fun(int a, int b = 0, int c = 0)
{
	cout << a << b << c << endl;
}
int main()
{
	int a = 1;
	int b = 2;
	int c = 3;
	fun(a,b);
	fun(a, b, c);
	return 0;
}

注意事项:

  •  半缺省参数必须从右往左依次给出,不能间隔着给

如果是从左往右给出,那么会出现以下两种情况:

为了确保形参C能够接受到数值必须占用一个实参,那么1的指向反而乱套了无论是给a还是b都可以。

而从右往左就不会出现这种情况。这里就像是五线谱,实参与形参的位置顺序都是一一对应的。

  • 缺省参数不能在声明和定义中同时出现 (只能在声明中用)
//a.h
void fun(int a = 1);

//a.cpp
void fun(int a = 2)
{

}

这样编译器无法确定该用哪个值

  • 缺省值必须是全局变量或常量
  • C语言不支持

二.函数重载

2.1函数重载概念

即在同一作用域下——功能类似的同名函数(参数个数、类型、类型顺序不同),通俗点就是一词多义。

//参数类型不同
int fun1(int a, int b)
{
	cout << "fun1(int a,int b)" << endl;
	return a + b;
}

double fun1(double a, double b)
{
	cout << "fun1(double a,double b)" << endl;
	return a + b;
}

//参数个数不同
void fun2()
{
	cout << "fun2()" << endl;
}

void fun2(int a)
{
	cout << "fun2(int a)" << endl;
}

//类型顺序不同
void fun3(int a, char b)
{
	cout << "fun3(int a,char b)" << endl;
}

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


int main()
{
	fun1(10,20);
	fun1(10.1, 20.2);

	fun2();
	fun2(10);

	fun3(10, 'a');
	fun3('a',10);

	return 0;
}

上述例子可以看到在有多个同名函数的情况下,编译器会根据参数个数、类型、类型顺序 进行相应的匹配。

不过当我们所用的实参对应不到相关的同名函数时就会报错。

确实是可以隐式转换,问题是int转double还是double转int呢?所以有时候存在多个重载函数时反而会有歧义。这时候只要去掉其中一个重载就可以隐式转换了。

我们再结合缺省参数时不传实参的重载函数也会发生歧义,编译器也不知道要调用哪个重载函数了,这种情况也需要注意。 

函数重载有利有弊吧,方便的同时也是要付出一些代价的~

2.2c++支持函数重载原理——命名修饰

在c/c++中一个程序要运行起来,需要经历以下阶段:预处理——编译——汇编——链接

  • 预处理:生成Fun.i与Test.i文件,其中前者包含声明与定义,而后者只有Fun.h声明没有定义。
  • 编译:生成Fun.s与Test.s文件,其中由main函数进行调用相关函数,但由于Test.i中的main函数只包含声明并没有定义,这意味着call不到地址,在这种情况下编译器只能先对照声明是否匹配,就算声明匹配成功这也只能算是个承诺先放你到下一阶段,最后还是要查地址的。
  • 汇编:生成Fun.o与Test.o文件
  • 链接:合并到一起并解决无法确定函数地址的问题,由于c语言在该阶段会生成一个符号表,可以在此去寻找函数名字与地址进一步验证之前的承诺。但c++不同,它不会生成符号表,而是有一套独特的命名规则。

归根结底就是在编译的时候c与c++都一样会有无法直接找到地址的问题,只不过最后在链接的时候双方的处理方式不同,c语言靠符号表,而c++靠独特的函数命名修饰原则。

这是在linux环境下由gcc编译完成的命名修饰样例。

当然我们不用这么去细究这些,只需要知道函数重载中是c++特有的即可。

总结

到此这篇关于C++缺省参数与重载函数的文章就介绍到这了,更多相关C++缺省参数与重载函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实例真题讲解数据结构中单向环形链表

    C语言实例真题讲解数据结构中单向环形链表

    链表可以说是一种最为基础的数据结构了,而单向链表更是基础中的基础。链表是由一组元素以特定的顺序组合或链接在一起的,不同元素之间在逻辑上相邻,但是在物理上并不一定相邻。在维护一组数据集合时,就可以使用链表,这一点和数组很相似
    2022-04-04
  • C语言实现简易的扫雷游戏

    C语言实现简易的扫雷游戏

    这篇文章主要为大家详细介绍了C语言实现简易的扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C语言算法练习之求二维数组最值问题

    C语言算法练习之求二维数组最值问题

    这篇文章主要为大家介绍了C语言算法练习中求二维数组最值的实现方法,文中的示例代码讲解详细,对我们学习C语言有一定帮助,需要的可以参考一下
    2022-09-09
  • C++ STL容器详解之红黑树部分模拟实现

    C++ STL容器详解之红黑树部分模拟实现

    本文主要对红黑树进行了详细介绍,并对其核心功能进行了模拟实现。文中的代码对我们的学习或工作有一定的价值,感兴趣的小伙伴可以了解一下
    2021-12-12
  • 在QT5中实现求两个输入值的和并输出(实例)

    在QT5中实现求两个输入值的和并输出(实例)

    下面小编就为大家带来一篇在QT5中实现求两个输入值的和并输出(实例)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • C语言实现Fibonacci数列递归

    C语言实现Fibonacci数列递归

    这篇文章主要介绍了C语言实现Fibonacci数列递归,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C++ OpenCV技术实战之身份证离线识别

    C++ OpenCV技术实战之身份证离线识别

    OpenCV身份证离线识别技术的主要技术就是通过OpenCV找到身份证号码区域,然后通过OCR进行数字识别该区域的截图即可得到身份证号码。感兴趣的可以了解一下
    2021-12-12
  • C++实现简单的ls命令及其原理

    C++实现简单的ls命令及其原理

    这篇文章主要介绍了C++实现简单的ls命令及其原理,C++实现ls命令可通过调用系统函数实现读取目录中的文件名和属性,再通过标准输出进行显示,需要的朋友可以参考下
    2023-05-05
  • C++继承和动态内存分配

    C++继承和动态内存分配

    这篇文章主要介绍了C++继承和动态内存分配,当我们的基类使用动态内存分配,并且重新定义赋值和复制构造函数,这会对派生类的实现有什么影响呢?我们带罩疑问俩姐下面文章内容吧
    2022-01-01
  • C++中的函数返回值与拷贝用法

    C++中的函数返回值与拷贝用法

    这篇文章主要介绍了C++中的函数返回值与拷贝用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论