CPP复习笔记-第3章-函数
现在我们来复习第3章——函数。
函数原型
函数需要在主函数前声明。函数原型可以不需要参数名。以下三种函数原型等价:
1
2
3double max(double,double);
double max(double x,double y);
double max(double a,double b);
没那么熟悉的常用数学函数原型
1 |
|
函数参数的传递
有三种方式:传值调用、指针调用、引用调用。
实参传值的副作用
避免add(++x,x+y)
之类的写法,因为不同编译器对实参求值的顺序可能不同。
默认参数
- 默认参数必须是参数表中最右边的。例如
double dist(double,double,double = 0,double = 1);
.
- 默认参数要且仅要在函数名第一次出现时指定。
- 默认值可以是常量、全局变量或函数调用,但不能是局部变量。
- 默认参数可用于内联函数。
指针调用和引用调用
1 |
|
注意 只有const引用对应的实参可以是常量或表达式,非约束的引用参数对应的实参必须是对象名。
函数的返回类型
- 使用指针函数可以节省匿名对象造成的时空消耗。
- 指针函数不能返回局部变量的指针。
- 返回引用比返回指针更直接,可读性更好。引用函数不能返回局部变量。
函数调用机制
- 嵌套调用
- 递归调用
函数地址
对于一个函数原型int func();
,func
和&func
以及*&func
都是函数的入口地址。
以下三种调用都可以达到相同的效果:
1
2
3func();//名方式调用
(&func)();//地址方式调用
(*&func)();//间址调用
在后两种调用方式中,第一个括号不能省略,因为地址表达式的计算要优先于参数结合。
函数指针
可参阅菜鸟教程:https://www.runoob.com/w3cnote/cpp-func-pointer.html
内联函数
- inline关键字要在函数名第一次出现时指定
- 内联函数中不能有复杂的流程控制语句,否则内联无效。
- 递归函数不能说明为内联函数。
重载函数
函数返回值的类型不起作用
即int func(int);
和double func(double);
不是重载函数,编译器会认为函数重复说明;
使用默认参数时可能产生二义性
1 |
|
如有以上函数定义,则在调用max(5,3)
时,无法确定调用哪个函数。
本章的其他内容
变量作用域
参考菜鸟教程:https://www.runoob.com/cplusplus/cpp-variable-scope.html
注意这几个标识符:auto
register
extern
static
在块内,当局部变量与全局变量同名时,全局变量被屏蔽。若要访问全局变量,可用作用域运算符::
预处理指令
掌握文件包含、宏定义、条件编译。
更多内容
其他内容详见课本,此处不再赘述。
CPP复习笔记-第3章-函数
https://www.jollyan.top/cpp-fu-xi-bi-ji-di-3-zhang/