C++第三弹:函数重载

概念

函数重载是函数的一种特殊情况,在C++中允许在同一作用域中声明几个功能类似的同名函数,这些同名的函数的形参列表(参数的个数或类型或顺序)必须不同,函数重载常用来处理实现功能类似数据类型不同的问题。比如说我们数学中的两个数字相加的法问题,我们可以用两个整型数字相加,也可以用double类型的数字相加等等。
例子:

#include <iostream>
using namespace std;

int Add(int left, int right)
{
    
    
	return left + right;
}
double Add(double left, double right)
{
    
    
	return left + right;
}
long Add(long left, long right)
{
    
    
	return left + right;
}
int main()
{
    
    
	Add(10, 20);
	Add(12.12, 12.13);
	Add(12L, 30L);
	return 0;
}

注意:C++中如果只有返回值类型不同是无法构成重载的,比如下面的这个例子

short Add(short left, short right)
{
    
    
	return left + right;
}
int Add(short left, short right)
{
    
    
	return left + right;
}
//不构成重载

这两个函数为什么不能构成重载函数能?这是因为在C++中,调用一个函数时是可以忽略返回值的,如果我们使用这两个函数,那么编译器就不知道我们具体要调用的是那个函数了。
由此,我们便可以总结出C++函数重载的规则了

1.函数名称必须相同。
2.参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
3.函数的返回类型可以相同也可以不相同。
4.仅仅返回类型不同不足以成为函数的重载

为什么C++支持函数重载,而C语言不支持

在这里插入图片描述
在这里插入图片描述
从这两张图中可以看出,编译器在编译.c和.cpp时,对函数的重命名是不一样的,在编译.c文件时只是在函数名称前面加上“_”,也就是说,假如两个函数的名称都是Add();尽管里面的参数是不相同的,但是当编译器在编译的时候都会重命名为"_Add",编译是,由于编译器不知道我们要调用的是那个函数,会出错;但是在C++中,编译时函数的名称被重命名成“?Add@@YANNN@Z”这种形式,其中‘?’表示名称开始,‘?’后边是函数名“@@YA”表示参数表开始,后边的3个字符分别表示返回值类型,两个参数类型。“@Z”表示名称结束,这样便保证了两个函数生成的符号表中的名称不一样,编译时不会出错,所以C++支持函数的重载。

猜你喜欢

转载自blog.csdn.net/qq_43825377/article/details/109234523