重载的概念
重载:同一标识符在不同的上下文有不同的意义;
C++中的函数重载
(1)函数重载
用同一个函数名定义不同的函数;
当函数名和不同的参数搭配时函数的意义不同;
int func(int x)
{
return x;
}
int func(int a,int b)
{
return a+b;
}
int func(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()
{
fun(1,2); //哪一个函数被调用?会出现二意性,使用参数默认时,不要使用函数重载,反过来也一样。
return 0;
}
编译器调用重载函数的准则
(1)将所有同名函数作为候选者;
(2)尝试寻找可行的候选函数;
精确匹配实参;
通过默认参数能够匹配实参;
通过默认类型转换匹配实参;
(3)匹配失败
最总寻找到的可行候选函数不唯一,则出现二义性,编译失败。
无法匹配所有的候选者,函数未定义,编译失败。
函数重载的注意事项
(1)重载函数在本质上是相互独立的不同函数;
(2)重载函数的函数类型是不同的;
(3)函数返回值不能作为函数重载的依据;与返回值没有半毛钱关系。
函数重载是由函数名和参数列表决定的。
下面程序的哪一个函数将被调用?
int func(int a)
{
return a;
}
int func(int a,int b)
{
retunr a+b;
}
int func(const char* s)
{
return strlen(s);
}
typedef int(*PFUNC)(int a);
int main()
{
PFUNC p = func;
p(1); //哪一个函数将会被调用?
return 0;
}
函数重载与函数指针
(1)当使用重载函数名对函数指针进行赋值时:根据重载规则挑选与函数指针参数列表一致的候选者;严格匹配候选者的函数类型与函数指针的函数类型。
C++和C的相互调用
(1)在项目中融合C++和C代码是实际工程中不可避免的;
(2)虽然C++编译器能够兼容C语言的编译方式,但C++编译器会优先使用C++的方式进行编译;
(3)利用extern关键字强制让C++编译器对代码进行C方式编译。
