一、重载(overloading) :函数名字相同,而参数不同。返回类型可以相同也可以不同。
若有题目为:实现两个数相加,一般我们都会想到如下代码:
int Sum(int a,int b)
{
return a+b;
}
但事实我们考虑并不全面,因为并没有给出要求是实现两个整型数相加,我们还需要考虑double、float等等其他类型,需要全面考虑,但之前在c语言中不允许实现如下代码 :
int Sum(int a,int b)//?Sum@@YAHHH@Z
{
return a+b;
}
doubel Sum(doubel a,double b)//?Sum@@YANNN@Z
{
return a+b;
}
但在c++中我们可以实现,原因是因为C语言和C++的符号生成规则不同!
符号生成规则:?函数名称@@Y调用约定 返回值类型 形参类型 形参类型@Z
函数返回值
函数名称
形参列表:形参类型、个数、顺序
int Add(int, int); // ?Add@@YAHHH@Z
double Add(int, int); // ?Add@@YANHH@Z
double Add1(int, int); // ?Add1@@YANHH@Z
double Add1(double, double); // ?Add1@@YANNN@Z
double Add1(double, double, double);// ?Add1@@YANNNN@Z
double Add1(double,int); //?Add1@@YANNH@Z
double Add1(int, double); //?Add1@@YANHN@Z
重载特点:
1.不能使编译器产生二义性
2.不依赖返回值
3.三要素:同作用域、同名、参数不同
二、inline内联函数:编译阶段,在调用点直接将代码展开
inline int Sum(int a, int b)//_Sum_int_int .text 本文件
{
return a + b;
}
1.内联函数和static修饰的函数的区别:
共同点:都是本文件可见;
不同点:内联函数没有栈帧的开辟和清理的开销;
static修饰的函数有开栈和清栈的开销;
2.优点:提高效率;
3.缺点:以代码膨胀为代价,空间浪费大;
建议适用内联的情况:函数代码的执行开销小于函数代码的开栈、清栈开销;
4.注意事项:
1.写在头文件;
2.只在release版本生效,debug版本不生效,依旧有开栈清栈过程;
3.并不是所有函数都能写成内联,例如:递归、while、switch不可以;
4.基于实现,不是基于声明的,若加在声明中是无效的。
三、C/C++的相互调用
1.C++调用C方法:用 extern "C" (其包含的代码以C语言处理)将声明包含
extern "C"
{
extern int Sum(int, int);
}
2.C调用C++方法:用 extern "C" (其包含的代码以C语言处理)将代码包含,分两种情况
①:C++能修改:在.cpp文件中添加extern声明
extern "C"
{
int Sum(int a, int b)
{
return a+b;
}
}
②:C++不能修改:添加中间层文件
//新建一个.cpp
extern int Sum(int, int);
extern "C"
{
int MySum(int a, int b)
{
return Sum(a, b);
}
}
判断C++是否能修改:
#ifdef __cplusplus//如果宏定义,C++会编译好,C未定义
extern "C"
{
#endif
int Sum(int a, int b)
{
return a + b;
}
#ifdef __cplusplus
}
#endif