c++函数形参可以给默认值。函数声明时可以给默认值
函数有默认值,没有实参,用默认值
函数有默认值,有实参,用实参
形参和实参:从左向右匹配,从右向左依次赋值。
函数的默认值:
1、自右向左依次赋值 2、不能重复赋值(声明中给出默认值,定义中再不允许给出默认值) 3、一般给在声明上
_cdecl:c的标准调用约定
_stdcall:windows的标准调用约定
_fastcall:快速调用约定
函数声明生成函数符号
c语言:函数声明生成的函数符号只和函数名有关 。_cdel调用约定(C标准调用约定):函数名前加下划线
c++:函数符号与函数原型(返回值,形参,函数名)有关
_cdecl调用约定:“?”+函数名+参数表的开始标识 “@@YA” + 函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。
bool Compare(int a, int b) //?Compare@@YA_NHH@Z
void Sort(double arr[], int len);//?Sort@@YAXQANH@Z
void Sort(int arr[], int len);// ?Sort@@YAXQAHH@Z ?+Sort函数名+@@YA(c标准调用约定)+X(void返回值)+ QAH整形指针 H整型+@Z(有参数)
函数返回值类型 void(X) bool(_N) 参数类型int(H)double(N) long(J)
函数重载:同名函数的关系
形参能作为函数重载的依据,返回值不能作为函数重载的依据。是因为调用点看不到函数的返回值,能看到实参类型,从而找到参数类型相同的
int rt = Compare(10,20)(红色的部分为函数调用点)
函数重载三要素:1、同名 2、形参不同(类型、个数、顺序)3、同作用域
重载时参数匹配不上,试着参数类型转换。如果有二义性则报错
内存中最多能存放整形数据的个数:(unsigned int)(-1)/size of(int) -1(ff ff ff ff)=2^32=4G
inline 函数-----》空间换时间的思想
在函数的调用点直接展开函数,找不到定义点(不生成函数符号)
普通函数有开栈清栈操作。inline函数无开栈清栈
执行的开销小于开栈清栈(调用)开销,建议用inline
执行的开销大于调用开销,不建议使用inline函数
inline函数和static修饰的函数区别:static函数有开栈和清栈操作
inline函数和宏的区别:inline在编译期间处理,有类型检查和安全检查
宏在预编译期间处理,无类型检查和安全检查
inline函数的注意事项:1、写在头文件下
2、只在release版本生效
3、内联只是给编译器的建议(展不展开由编译器决定)递归、循环、switch一定不会处理成内联
4、加在声明点的inline无效,加在定义点才有可能实现,内联是基于实现的不是基于声明的。
c89下有32个关键字,没有inline。C98标准时引入4个,其中有inline
const a
c语言中const 修饰的a是个常变量,编译阶段看常变量有没有做左值,有则报错,其他的和普通变量相同。
c++中const修饰的变量是常量 要初始化。不予许修改常量内存,不允许普通指针指向常量内存(有修改常量内存块的风险)
编译阶段把用到常量的地方替换成常量初始化的值