文章目录
前言
在本文章中,我们将要详细介绍一下C++c++缺省参数与函数重载的内容,具体包括定义,使用以及等缺省参数的概念,使用,分类,注意事项和函数重载中的一系列知识以及二者结合会产生什么样的效果相关的知识等。
一、缺省参数
1.缺省参数的概念与使用
🌟🌟缺省参数是声明或定义是为函数参数指定的一个缺省值。在调用该函数时,如果没有指定实参,则采用这个缺省值作为函数参数。否则使用指定形参。
在调用fun函数时,没有传参,则采用给形参赋的那个缺省值。
2.缺省参数的分类
🌝 🌝 .全缺省
函数的形参全部给缺省值。
🌝 🌝 .半缺省
函数的形参只有一部分给缺省值。
3.缺省参数注意事项
🎁🎁1.半缺省参数必须从右往左依次赋值,不能连续给。
🎁🎁2.声明和定义不能同时给缺省值,会产生调用歧义
我们一般建议声明给缺省值,定义正常写。
🎁🎁3.缺省值必须是全局变量或者常量
🎁🎁4.c语言不支持
二、函数重载
1.什么是函数重载
函数重载:在同一作用域下,实现几个功能相似的同名函数。
同名不同参。
2.函数重载的几种形式
🐯🐯参数类型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
🐯🐯参数数量不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
🐯🐯参数顺序不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
仅仅对参数有要求,对返回值无要求
为什莫呢??
💓💓调用函数时,返回值并不重要,考虑的是函数名称和参数,返回值是调用处理数据之后考虑的事情
3.函数重载与缺省值的结合
函数重载与缺省值的结合是否可行呢??
这样是可以的,传参调用第一个f函数,虽然有缺省值,但是进行了传参,缺省值不进行使用。
看一下这段代码》》
这个进行了报错,在传参时我们发现调用第一个第二个都是合理的,这样两个就发生了冲突
函数重载与缺省值结合,不传参数调用有二义性
4.为什么c++支持函数重载??
一般编译要经过这几个步骤
💥 预处理阶段:头文件展开,去注释,宏替换,条件编译等
💥 编译:语法分析,词法分析,符号汇总(生成汇编代码)
💥 汇编:形成符号表,便车给二进制指令。
💥 链接:合并段表,符号表合并和符号表重定位。
🌟🌟项目一般都是由多个头文件和源文件构成。
比如a.cpp在调用b.cpp中的Add函数,编译后生成a.obj的目标文件,但是没有Add函数的地址。
因为Add函数是在b.cpp中定义的。函数地址在b.obj中。
🌟🌟编译器在链接时,看到a.obj在调用Add,但是没有Add函数的地址,就回到b.obj的符号表中去找Add的地址,然后连接到一起。链接时找函数地址
🌟🌟那么链接时,面对Add函数,链接器会使用哪个名字去找呢?这里每个编译器都有自己的函数名修饰规则
🌟🌟在Linux中g++采用(_Z+函数长度+函数名+类型首字母),window中也有自己独特的函数名修饰规则。只要参数不同,所形成的名字就会不同,这样就完成重载。
🌟🌟但是c语言采用本来的函数名取进行寻找,不加任何修饰,同名函数没办法区分,不支持重载
采用C语言编译器编译后结果
在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变
采用C++编译器编译后结果
在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中
Windows下名字修饰规则
C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
总结
以上就是今天要讲的内容,本文仅仅详细介绍了C++c++缺省参数与函数重载,希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘 😘