函数重载
函数重载:
用同一个函数名定义不同的函数
当函数名和不同的参数搭配时函数的含义不同
int func(int x)
{
return x;
}
int func(int a,int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
eg:
#include <stdio.h>
#include <string.h>
int func(int x)
{
return 0;
}
int func(int a,int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
int main(int arg,char *argv[])
{
printf("%d\n",func(3));
printf("%d\n",func(4,5));
printf("%d\n",func("zhuweican"));
}
函数重载的条件:
函数重载至少满足下面的一个条件:
1、函数个数不同
2、参数类型不同
3、参数顺序不同
c++中的函数重载,编译器调用重载函数的准则
1、将所有同名函数作为候选者
2、尝试寻找可行的候选函数
1、精确匹配实参
2、通过默认参数能够匹配实参
3、通过默认类型转换匹配实参
匹配失败:
1、最终寻找到的候选函数不唯一,则出现二义性,编译失败
2、无法匹配所有候选者,函数未定义,编译失败
函数重载的注意事项
1、重载函数在本质上是相互独立的不同函数
2、重载函数的函数类型不同
3、函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的
重载函数遇上函数指针:
1、将重载函数名赋值给函数指针时
1、根据重载规则挑选与函数指针参数列表一致的候选者
2、严格匹配候选者的函数类型与函数指针的函数类型
eg:
#include <stdio.h>
#include <string.h>
int func(int x)
{
return x;
}
int func(int a,int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
typedef int (*PFUNC) (int a);
int main(int argc,char* argv[])
{
int c = 0;
PFUNC p = func;
c = p(1);
printf("c = %d\n",c);
}
重载与指针
注意:
1、函数重载必然发生在同一个作用域中
2、编译器需要参数列表或函数类型进行函数选择
3、无法直接通过函数名得到重载函数的入口地址
c++和C相互调用
1、实际工程中C++和C代码相互调用是必不可免的
2、C++编译器能够兼容C语言的编译方式
3、C++编译器会优先使用C++编译的方式
4、extern 关键字能够强制让C++编译器进行C方式的编译
问题:如何保证一段C代码只会以C的方式编译??