重载的概念:同一个标识符在不同的标识符有不同的含义。
c++中的函数重载:
用同一个函数名定义不同的函数;当函数名和不同的参数搭配时函数的意义不同;
int func(int x)
{
return x;
}
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
函数重载至少满足下面一个条件:
1.函数参数类型不同;
2.函数参数个数不同;
3.函数参数顺序不同;
当函数默认参数遇上函数重载时,极易产生二义性。因此应当避免同时使用函数默认参数和重载,避免二义性是程序设计的基本准则。
int func(int a, int b, int c = 0)
{
return a * b * c;
}
int func(int a, int b)
{
return a + b;
}
int main(int argc, char *argv[])
{
int c = 0;
c = func(1, 2); // 存在二义性,调用失败,编译不能通过
printf("c = %d\n", c);
printf("Press enter to continue ...");
getchar();
return 0;
}
编译器调用重载函数的准则:
将所有同名函数作为候选者,尝试寻找可行的候选函数,精确匹配实参形参。若匹配失败,则可能是寻找到的可候选函数不唯一,则出现二义性,编译失败。另外,可能无法匹配所有候选者,函数未定义,匹配失败。
函数重载的注意事项:
重载在本质上是相互独立的不同函数,重载函数的类型是不同的,重载返回值不能作为重载函数的依据,函数重载是由函数名和参数表列组成的。
函数重载与函数指针:
当使用重载函数名对函数指针赋值时,根据重载规则挑选与函数指针类型参数列表一致的候选者,严格匹配候选者的函数类型和函数指针的函数类型
int func(int x) // int(int a)
{
return x;
}
int func(int a, int b)
{
return a + b;
}
typedef int(*PFUNC)(int a); // int(int a)
int main(int argc, char *argv[])
{
int c = 0;
PFUNC p = func;
c = p(1);//调用func(1)
printf("c = %d\n", c);
printf("Press enter to continue ...");
getchar();
return 0;
}
c++和c的相互调用:
在实际项目工程中,融合c++和c代码是不可避免的。虽然c++编译器能够兼容c的编译方式,但c++编译器会优先使用c++的编译方式编译。利用extern关键字让c++编译器对代码进行c方式编译。
——cplusplus是c++标准的内置宏定义,它的意义在于让c代码通过c编译器的编译,也可以在c++中以c方式编译
#ifdef __cplusplus
extern "C" {
#endif
//函数声明或函数定义
#ifdef __cplusplus
}
#endif
注意,c++编译器不能以c方式编译多个重载函数
#ifdef __cplusplus
extern "C" {
#endif
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
#ifdef __cplusplus
}
#endif