函数重载遇上默认参数;
#include<stdio.h> #include<string.h> int fun(int a, int b, int c = 0) { return a * b * c; } int fun(int a, int b) { return a + b ; } int main(void) { int c = fun(1,2); return 0; }
编译器报错,因为 int c = fun(1,2); 这里调用两个函数都可以,所以编译器会报错;
当函数默认参数和函数重载相冲突时,编译器会报错;
这是C++的问题,C++引用了很多特性,特性之间会冲突;后续语言java和C#,他们就没有默认参数这种特性;C++众多的特性有可能是相互冲突的;
函数重载的本质,函数重载是由函数名和参数列表决定的;重载函数在本质上是相互独立不同函数;重载函数的函数类型不同;函数的返回值不能作为函数重载的依据;
1 #include<stdio.h> 2 3 int add(int a, int b) 4 { 5 return a + b; 6 } 7 int add(int a, int b, int c) 8 { 9 return a + b + c; 10 } 11 12 int main(int argc, char **argv) 13 { 14 printf("(int(*)(int,int))add = %p ", (int(*)(int,int))add); 15 printf("(int(*)(int,int,int))add = %p ", (int(*)(int,int,int))add); 16 return 0; 17 }
(int(*)(int,int))add = 0x8048474 (int(*)(int,int,int))add = 0x8048482
注意:
函数重载必须发生在同一个作用域里面
编译器需要参数列表或函数类型进行函数选择;
无法直接通过函数名得到重载函数的入口地址;
C++调用C代码
extern关键字可以, C++编译器定义了__cplusplus