C++11
6.1 函数基础
- 函数调用的两项工作
- 控制权:主调函数中断,被调函数执行
- 隐式定义并初始化形参
- return的两项工作
- 返回值
- 控制权: 转移到主调函数
- 实参的数目和类型与形参对应,如果不对应需要能够隐式转化
- 形参列表不能忽略,如果没有形参可以为空或者void
- 每个形参必须带有自己的类型
- 形参不能重名,也不能与函数最外层的局部变量重名
- 返回类型不能是数组或者函数,可以是其指针
6.1.1 局部对象
名字有作用域,对象有生命周期
- 自动对象:控制路径经过变量定义语句时创建对象,到达所在块的末尾时销毁
- 局部静态对象:控制路径经过变量定义语句时创建对象,程序结束时销毁
6.1.2 函数声明
- 函数声明/函数原型:不需要写函数体,使用分号代替
- 应该在头文件中声明,源文件中定义,然后原文件包含头文件,其他使用函数的原文件或头文件也只包含头文件,这样修改函数接口时只需要修改一处声明。
6.1.3 分离式编译
- 对于将函数定义在其他源文件中的情况,分离式编译使得可以只重新编译修改过的源文件,生成对象代码.obj或.o,然后链接在一起
CC -c factmain.cc # factmain.o
CC -c fact.cc # fact.o
CC factmain.o fact.o #factmain.exe
CC factmain.o fact.o -o main #main.exe
6.2 参数传递
- 引用传递:形参是实参的别名
- 值传递:形参与实参是两个对象
6.2.1 传值参数
- 改动不影响实参
- 指针形参:指针形参不影响实参,但是可以用于修改所指对象;建议用引用传递,而非指针
6.2.2 传引用参数
- 可以避免使用拷贝,对于大的类对象或者容器对象比较合适;此外有些类类型不能拷贝,如IO
- 可以使用引用传递返回值
6.2.3 const形参和实参
- 如果const是顶层const,实参是常量或者非常量都可以,因此此时不能用const形参与非const形参做区分,实际是相同的参数
- 指针或者引用的形参与const:
- 对于底层const的指针或者引用,可以使用常量或者非常量做实参,引用也可以使用字面值做实参
- 对于非底层const的指针或者引用,只能使用非常量,也不能使用字面值
- 如果不修改参数值尽量使用常量引用,因为一般引用的实参选择范围更小,会在传递参数时出现不匹配,此外在不同函数之间重复调用时会出现参数不匹配