C中经常把短且经常执行的代码段写成宏,而不是写成函数,避免函数调用,在预编译时替换宏,来提升效率 1.在C中也会出现,宏看起来像个函数调用,但是会有隐藏一些难以发现的错误。宏函数也没有作用域。
#define ADD(x, y) x+y //如果不加括号,有些地方会引起问题再如
#define CMP(a, b) ((a) < (b) ? (a) : (b)) int a = 10; int b = 20; CMP(++a, b) //预期结果11 ((++a) < (b) ? (++a) : (b))在C++中,预定义宏的概念是用内敛函数来实现的,而内敛函数本身也是一个真正的函数,内联函数具有普通函数的所有行为,唯一不同之处在于内联函数会在适当的地方想预编译宏一样展开,所以不需要函数调用的开销。 1.类内部的成员函数,默认前面会加inline关键字 2.内联函数注意事项
内联函数注意事项:
//内联函数注意事项 inline void func() //内联函数声明 void func() {} //如果函数实现没有加上inline关键字,那么这个函数依然不算内联函数内联函数并不是何时何地都有效,对于任何类型的函数,编译器都会将函数类型,(包括函数名字,参数类型,返回值类型)放入符号表中,同样,当编译器看到内联函数时,检查代码没有错误后,也会放入, 但是 c++内联编译器会有一些限制,一下情况编译器可能会考虑不会将函数进行内联编译:
不能存在任何形式的循环语句,如for不能存在过多的条件判断语句函数体不能过于庞大不能对函数进行取址操作内联仅仅只是给编译器一个建议,编译器不一定会接受这个建议,如果没有将函数声明为内联函数,那么编译器也可能将此函数做内联编译。
c++中函数名称可以重复,重载条件: 1.且在同一个作用域下, 2.两个函数名称相同,。 3.函数的参数个数不同或则类型不同,或者顺序不同。 返回值可以作为函数重载的条件吗?—不可以,出现二义性
注意 函数重载遇到了 默认参数时候,要注意避免二义性问题 引用的重载版本
void func(int &a) { cout << "int &a " << endl; } void func(const int &a) //const也可以作为重载条件|int tmp = 10;const int &a = tmp { cout << "const int &a" <<endl; } void test() { //int a = 10; func(10) //调用const版本 }C++在重载函数时,编译器会自动给函数改名,如果func()改名后可能为funcv,v是void即根据参数类型改名。 当c++在调用c函数时,默认链接调用改名后的函数 ,而c中不会出现重载,即编译器不会给函数改名。C++中调用c语言函数会出现失败,在c语言的代码中上如下代码,调用时不会出错。
#ifdef __cplusplus extern "c"{ #endif #ifdef __cplusplus } #endifc语言属性和行为分开处理了,类型检测不够。 c++的 封装,严格类型检测,让属性行为绑定。属性和行为作为一个整体来表示生活中的事物, 控制权限public共有权限, protected 保护权限 private 私有权限 私有权限在类内部可以访问,在外部不可以访问 共有权限在类内部可以访问,在外部也可以访问 保护权限类内部可以访问,当前类的子类可以访问,类外部不可以访问 struct和class是一个意思,唯一不同是默认权限,struct默认共有,class默认私有