一、 带默认值参数的函数(没有实参,形参有默认值)
1、形参默认值赋值必须从右向左
2、形参的默认值不能重复赋值
3、一般赋值在声明中
Q:普通函数和带默认值参数的函数有什么区别?
A:带默认值参数的函数,调用时可以不传入实参,形参就用了默认值;形参给默认值必须从右向左给;形参的默认值只能给一次,不能给多次。*重点*带有默认值参数的函数在调用时,虽然没有传入实参,但是汇编上还是要生成 push 汇编指令的,把形参默认值进行压栈,所以从汇编上来讲,并没有说你少传入一个实参,就能节省汇编指令,提高效率之说!
二、inline 函数(编译阶段,在函数调用点直接代码展开)
注意事项:
1、实现在头文件.h中
2、inline只在release版本
3、只是给编译器的一个建议(是否使用取决于编译器)
由于是在调用点展开代码,所以递归、循环、switch都不适合用
4、基于实现,而不是基于声明(inline放在声明函数中没有意义)
缺点:以代码膨胀为代价,即用空间换取时间
建议:开栈开销 > 执行开销 建议使用inline函数
开栈开销 < 执行开销 不建议
引入】inline和static的区别
1、static有开栈清栈 inline则没有
2、inline是在编译阶段调用点展开
static函数的属性 local域
引入】inline和宏
1、inline是在编译阶段,在调用点代码展开(编译阶段有词法、语法、语义分析,类型、安全的检查)
宏是在预编译阶段,宏替换(没有安全检查)
2、inline可以看成是更安全的宏
Q:内联函数和普通函数有什么区别
A:内联函数就是给普通函数的定义前面加个 inline 关键字,普通函数调用有调用开销, 内联函数没有;内联是在编译阶段在调用点把函数的代码展开;内联函数必须在调用点之前出现,只能在本文件作用域可见;内联函数在 release 版本才起作用,在 debug 版本中不起作用;内联只 是对编译器的建议,是否真的处理成内联函数,最终由编译器来决定。
内联函数和普通函数最大的区别就是,在编译阶段完成后生成的 obj 文件中,普通函数是要在符号表生成符号的,而内联函数在编译阶段被处理了,在函数的调用点把函数代码展开,因此在符号表中,inline 函数根本就没有符号,因此无法进行链接,因此,内联函数只在本文件中可见,一般都写在头文件当中,被源文件包含使用,内联少了函数调用栈帧的开辟和回退,提高了调用效率。
三、函数重载
函数的符号生成规则:
C: 函数名
C++:函数原型(返回值、函数名、函数参数(类型、个数、顺序))
三要素:1.同名 2.不同参 3.同作用域