定义:
1.一组函数,其中函数名相同,参数列表的类型和个数不同,这一组函数称为函数重载。
Q:为什么C语言代码不支持函数重载?
A:C++代码产生的函数符号是由函数名+参数列表类型构成的,C代码产生的符号只有函数名。
2.一组函数想要构成重载必然要处在同一作用域当中
bool compare(int a,int b){//compare_int_int
return a>b;
}
bool compare(double a,double b){//compare_double_double
return a>b;
}
bool compare(const char* a,const char* b){//compare_const char*_const char*
return a>b;
}
int main(){
bool compare(int a,int b);
cout<<compare(10,10)<<endl;
cout<<compare(10.0,10.0)<<endl;//精度丢失
cout<<compare('the','world')<<endl;//报错
//函数在当前局部作用域声明后,后面都会去调用声明了的函数,而不会去调用全局中的重载函数
}
3.const或volatile时对形参类型的影响
void func(int a);
void func(const int a);
//无法构成重载,对于编译器来说,参数类型都是int
void func(int *a);
void func(const int *a);
//运行通过,构成重载
void func(int *a);
void func(int *const a);
//运行不通过
4.一组函数函数名和参数列表都相同,仅仅返回值不同,不能构成重载。生成符号和返回值没有任何关系
5.C++调用C语言函数时链接会报错,因为C文件中函数符号只生成函数名,C++生成带参数列表的,找不到无法链接,除非在C++代码的函数声明处:
extern "C"{
int sum(int a,int b);//符号:sum "UND"
}
C代码调用C++函数时同样链接会报错,除非在C++代码的函数定义处:
extern "C"{
int sum(int a,int b){//sum .text
return a+b;
}
}
一般需要让函数以C语言方法运行但不确定代码是C++还是C语言时,不能直接用*extern “c”*因为C语言编译器不认识,一般:
#ifdef _cplusplus
extern "C"{
#endif
int sum(int a,int b){
return a+b;
}
#ifdef _cplusplus
}
#endif
如此一来,C语言有函数部分有效,而C++会将函数按C方法编译