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++编译时生成的函数符号,符号命名和函数的返回值类型是没有关系的,编译无法通过。