1:
C,C++使用宏定义的好处:
宏定义使用预处理器实现,没有参数压栈,代码生成等一系列的操作,所以他的效率很高。
缺点:
使用时所作的只是预处理器中符号表的简单替换,因此不能实现参数的有效性检测,也就不能享受C++编译器严格类型检查的好处。另外它的返回值也不能被强制转换为可以的合适类型,所以在使用上就存在着一定的隐患。另外当C++的操作或者表达式涉及到保护成员或者私有成员时,就不能使用宏定义来实现(因为无法将this指针放在合适的位置)
2:
使用inline的目的:
继承宏定义的优点,同时避开宏定义的缺点。函数的代码被直接放在符号表中,在使用时被直接替换,没有了调用的开销,效率也很高。inline函数也是一个真正的函数,编译器在调用一个inline函数时会检查它的类型,保证调用正确,从而避免了使用的局限性和隐患性。inline函数可以作为一个类的成员函数。
inline函数一般使用在函数的内容非常简单的情形。
3:
C++中函数的重载
C++中函数编译后变成 _function_int_float
因此C++根据函数的名字和参数类型来识别函数,从而实现了函数的重载
但是在C语言中函数编译后变成了_function,没有函数的参数,因此两者之间函数的编译形式不相同,在C++中调用C函数,需要特别的声明
extern “C”
{
#include"a.h"
#include"b.h"
//或者直接写上函数的声明;
void int(float);
}
再加一句,C,C++都只不对函数的返回类型进行检查。
4:函数重载中要注意的问题
当数字作为函数的参数输入时候,因为数字本身并没有类型,此时要进行隐式类型转换,但是对于某些重载函数来说,就会出现错误
void fun1(int xx);
void fun1(float yy);
void main()
{
fun1(1); //OK
fun1(float(1.0));//Error
fun1(0.0123); //Error
}
void fun1(int zz)
{
printf("function int\n");
}
void fun1(float zz)
{
printf("function float\n");
}
经过测试其实可以发现原因很简单,对于字面值 1 其默认的类型是int,所以就可以void fun1(int xx)是其最佳匹配的。而对于1.0,0.0123这样的数,编译器会将他们当成double类型的数字,那么在函数的匹配过程中,可以将其转换成int类型的,或者float类型的,这两种隐形转换都不是最佳匹配,所以就会出现函数调用的二义性。如果此时再定义一个这样的函数,void fun1(double)类型的函数,再调用
fun1(float(1.0));
fun1(0.0123);
这样就不会出错了。