C++函数重载

21 篇文章 1 订阅
本文介绍了C++中的函数重载概念,强调了它与C语言的区别。通过示例说明函数重载如何根据参数列表选择合适的函数进行调用,并警告了在不同作用域定义同名函数可能导致的问题。此外,还探讨了返回类型不能作为重载依据的原因,并提醒开发者在使用函数重载时保持函数在同一作用域内。
摘要由CSDN通过智能技术生成

C++函数重载

函数重载,就是可以定义多个参数列表不同函数名相同的函数,编译的时候不好产生错误。
C++支持函数重载,但在C中是不支持的,编译无法通过。
查看C和C++编译时生成的函数符号表:
在这里插入图片描述
在这里插入图片描述
可以看到,gcc编译时符号表生成的函数符号只有函数名,而g++编译除了函数名外,参数列表也会参与函数符号命名。在gcc中编写同名函数会出现链接错误,因为他们生成的函数符号都是一样的,链接器不知道要链接哪个符号。

#include <iostream>
#include <string.h>
using namespace std;

bool compare(int a, int b)
{
	cout << "compare(int , int)" << endl;
	return a > b;
}

bool compare(double a, double b)
{
	cout << "compare(double , double)" << endl;
	return a - b > 0.000001;
}

bool compare(const char* a, const char* b)
{
	cout << "compare(const char* , const char*)" << endl;
	return strcmp(a, b) > 0;
}


int main()
{
	compare(10, 20);
	compare(10.1, 10.2);
	compare("abc", "abd");
}

在这里插入图片描述
函数重载在调用时,会根据传入的实参个数和类型,来调用某个具体的重载函数。 如上面的代码中,当我们传入两个int类型的实参时,会调用compare(int , int),传入两个double时,调用compare(double , double)…

在定义重载函数时,我们要确保他们在同一作用域,否则会出现下面这样的问题:

#include <iostream>
#include <string.h>
using namespace std;

bool compare(int a, int b)
{
	cout << "compare(int , int)" << endl;
	return a > b;
}

bool compare(double a, double b)
{
	cout << "compare(double , double)" << endl;
	return a - b > 0.000001;
}

bool compare(const char* a, const char* b)
{
	cout << "compare(const char* , const char*)" << endl;
	return strcmp(a, b) > 0;
}


int main()
{
	bool compare(int a, int b);

	compare(10, 20);
	compare(10.1, 10.2);
	compare("abc", "abd");
}

在这里插入图片描述
这是因为编译器在编译时,会选择最近的作用域寻找函数的声明,当重载函数不在一个作用域,函数调用未声明作用域的情况下,只会调用最近声明的函数。所以

	compare(10, 20);
	compare(10.1, 10.2);
	compare("abc", "abd");

这三行代码都匹配的是bool compare(int a, int b);,所以会有double转int精度丢失、const char * 转int类型不匹配的问题。

也就是说,如果我们定义的同名函数不再同一作用域,根本就不是函数重载。

综上,一组函数要构成函数重载,首先需要他们是同名函数,参数列表的个数或类型不同,且在同一作用域。

那如果一组同名函数在同一作用域下,参数列表相同,返回值类型不同,能不能构成重载呢?
肯定是不行的!
可以看前面g++编译时生成的函数符号,符号命名和函数的返回值类型是没有关系的,编译无法通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_200_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值