什么是函数重载
我们先来看一下什么是函数重载
#includeusing namespace std; bool compare(int a, int b) { cout << "there is compare_int_int" << endl; return a > b; } bool compare(double a, double b) { cout << "there is compare_double_double" << endl; return a > b; } bool compare(const char * a,const char * b) { cout << "there is compare_char_char" << endl; return a > b; } int main() { compare(1, 2); compare(1.0, 2.0); compare("aaa", "bbb"); system("pause"); return 0; }
我们可以看到我们定义了三个同名函数,三个函数的返回值类型相同,函数名相同,但是函数参数不同,此时我们可以得出结论:一组函数中,函数名相同,返回值相同,参数列表的个数或者类型不同,那么这组函数就称为函数的重载
我们来看一下这段代码,这里我只展示主函数,函数的定义就用之前的
int main()
{
bool compare(int a, int b);
bool compare(const char* a, const char* b);
compare(1, 2);
compare(1.0, 2.0);
compare("aaa", "bbb");
system("pause");
return 0;
}
再来看看它的输出是什么
为什么compare(1.0,2.0)的输出是there is compare_int_int呢,因为函数重载它还有一个条件就是在同一个作用域内。之前我们把函数定义写在全局的,所以他会自动根据传递的参数进行匹配,但是我们在main函数声明一下,他会优先去看声明了那些函数,并根据声明的函数去判断所传的参数需要调用那个函数,而不是去全局区域去看定义了那些函数。
所以第二个结论:一组函数要称得上重载,就一定是处在同一个作用域之中的。
再来看看这个
#includeusing namespace std; bool compare(int a, int b) { cout << "there is compare_int_int" << endl; return a > b; } bool compare(const int a, const int b) { cout << "there is compare_int_int" << endl; return a > b; } int main() { bool compare(int a, int b); compare(1, 2); system("pause"); return 0; }
这个代码算不算函数重载呢,其实是不算的,如果要探究它为什么不算函数重载,我们要用typeinfo头文件来查看一下它的类型
#include#include using namespace std; int main() { int a = 10; const int b = 10; cout << typeid(a).name() << endl; cout << typeid(b).name() << endl; system("pause"); return 0; }
输出结果是
所以当参数加上const或者volatile的时候,他们的参数类型还是原来的,const和volatile只是给参数类型进行一个修饰,所以int 和 const是一样的。
此时得出结论三:参数加上const或者volatile修饰时,是不影响它的参数类型的
函数重载需要注意些什么
在函数中定义一个函数是不允许的,但是可以在函数中声明一个函数,这个在我们的第二段代码就可以看出
C++和C语言代码之间如何相互调用
再说这个问题之前,我还有个问题,就是C和C++都支持函数重载吗?
答案是否定的,C代码是不支持函数重载的。
因为在C++中,代码产生函数符号的时候,是函数名+参数列表类型组成的
而在C中,代码产生函数符号的时候,只由函数名来决定,如果用函数重载会造成链接错误。
现在我们来说一下两种语言的相互调用
C调用C++:在C++文件中,把C++的代码放在extern "C" { } 的大括号中
C++调用C:在C++文件中,把C的代码放在extern "C"{ }的大括号中
如果分不清楚,嫌麻烦,那么我们可以这样写
#ifdef __cplusplus
extern "C"{
#endif
int sum(int a, int b)
{
return a + b;
}
#ifdef __cplusplus
}
#endif
只要是C++编译器,其内部都内置了__cplusplus这个宏,而这段代码不管是用C还是用C++编译器生成,都是可以直接给其他的C项目调用



