c++之缺省函数函数重载
Posted better,faster
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++之缺省函数函数重载相关的知识,希望对你有一定的参考价值。
目录
如果将编译器修改,能否进行函数名相同,参数也相同,仅返回类型不同是否能进行重载
缺省参数
C语言中,函数没有指定参数列表时,默认可以接收任意多个参数。
C++中,因为严格的参数类型检测,没有参数列表的函数默认为void,不接收任何参数。
缺省参数是在声明或定义函数时为函数的参数指定一个默认值
在调用函数时,如果有实参就调用指定的实参,没有指定的实参那么就采用该默认值。
举个“栗子”
#include<iostream>
using namespace std;
int Add(int a=1,int b=2)
return a + b;
int main()
int x = 10, y = 9;
cout << Add() << endl; //如下图,在没有输入参数时,使用默认的参数,结果为3
cout<<(Add(10,20))<<endl; //调用时有实参,使用实参,结果为30
缺省分类
全缺省参数
将所有参数都设置为缺省参数
#include<iostream>
using namespace std;
int Add(int a=1,int b=2)
return a + b;
int main()
int x = 10, y = 9;
cout << Add() << endl; //输出为3
cout<<(Add(10,20))<<endl; //输出为30
半缺省参数
将部分参数设置为缺省参数,特别注意:缺省参数必须在函数参数末尾,且不能间隔着给
#include<iostream>
using namespace std;
int Add(int a,int b=2)
return a + b;
int main()
int x = 10, y = 9;
cout << Add(10) << endl; //输出12
cout<<(Add(10,20))<<endl; //输出30
函数重载
什么是函数重载?
C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。这就是重载函数。
重载函数常用来实现功能类似而所处理的数据类型不同的问题。
不能只有函数返回值类型不同。
int Add(int a,int b)
return a + b;
int Add(int a, double b)
return a + b;
int Add(int a, float b)
return a + b;
函数重载经典面试题
为什么C语言不能函数重载而c++可以进行函数重载?
解决上述问题,需要先简单了解一下程序运行的过程
1.预处理
头文件展开/宏替换/条件编译/去掉注释
2.编译
检查语法,生成汇编代码,生成符号表
3.汇编
把汇编代码转换成二进制的机器码
4.链接
链接到一起,生成可执行文件
add-c 1.把定义在文件中的函数调用,通过符号表找到函数地址,链接在一起
addd-cpp 2.把所有的.o进行合并,生成一个可执行文件
c语言为什么不可以函数重载?
c程序在链接的时候会把所有的目标文件进行整合,最终形成.exe文件,而在整合过程中,会把符号表进行汇聚,所以如果有几个相同函数名的函数,链接阶段将不知道调用的是同名函数的哪一个,进而导致编译器报错。
c++为什么可以函数重载?
c++中,在形成符号表的时候,会将重名函数进行修饰
修饰规则:_Z n name t,
n是函数名长度
name是函数名
t是所有参数类型的首字母缩写
进行修饰后的同名函数就可以在符号表中准确的对应不同的地址
如果将编译器修改,能否进行函数名相同,参数也相同,仅返回类型不同是否能进行重载
不能!!!
因为即使可以通过修改编译器,将返回类型加入修饰规则,使能通过编译,但是在调用的时候也很难区分是调用哪一个
例如:
int Func();
void Func();
在程序中调用Func();也不能区分出是调用哪个函数。
以上是关于c++之缺省函数函数重载的主要内容,如果未能解决你的问题,请参考以下文章