c++之缺省函数、函数重载

目录

缺省参数

举个“栗子”

缺省分类

全缺省参数

半缺省参数

函数重载

什么是函数重载?

 函数重载经典面试题

为什么C语言不能函数重载而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();也不能区分出是调用哪个函数。

Guess you like

Origin blog.csdn.net/m0_47646784/article/details/121135631