函数重载
1、什么是函数重载
在同一作用域下,函数名相同,参数列表不同的函数构成重载关系
函数重载与返回值类型、参数名无关
与作用域是否相同,以及参数列表的数量、参数类型、常属性不同等有关
void func(int* num,Student* s)
{
cout << "int" << endl;
}
void func(const int* num)
{
cout << "const int" << endl;
}
int func(double d,char ch,int* p)
{
cout << "double" << endl;
}
2、C++是如何实现函数重载的
通过 g++ -S 方式生成汇编代码可知,编译器会把函数的参数类型进行缩写后追加到函数名的末尾形成新的函数名,既是进行了换名操作,从而确保编译结果函数名不重复
3、extern “C”
因为通过C++编译器编译函数、调用语句时,会变成换名后的名字,但是项目中有可能需要去调用已经通过C编译器编译好的函数,它们是没有换名的,因此会调用失败
因为大部分情况下C编译好的文件无法重新使用C++编译器编译,所以只能想办法让C++编译器在调用C编译的函数时不要换名
通过 extern “C”{xxx} 让C++编译器按照C语言的格式编译函数,从而让调用语句与被调用函数名同名,这样就可以正确的调用C标准库、系统函数
extern "C"
{
void func(int num);
}
4、重载和隐藏
在同一作用域下,函数名相同,参数列表不同的函数构成重载关系
在不同作用域下,同名函数就构成了隐藏
void func(void)
{
}
namespace n1{
void func(void){
}
}
5、参数类型不匹配
当调用函数时,编译器会优先调用类型最匹配最精确的版本函数,如果没有最正确的,则会先做类型转换后再匹配,但如果没有能够进行类型转换的版本最后也会报错
但是不建议通过类型转换去调用函数,因为转换情况与编译器有关