函数
函数基础
局部对象
在 C++语言中,名字有作用域,对象有生命周期(lifetime), 理解这两个概念非常重要。
- 名字的作用域是程序文本的一部分,名字在其中可见。
- 对象的生命周期是程序执行过程中该对象存在的一段时间。
自动对象
局部静态对象
函数声明
分离式编译
C++语言支持所谓的分离式编
译 (separate compilation)。分离式编译允许我们把程序分割到几个文件中去,每个文件独 立编译。
编译和链接多个源文件
参数传递
每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化
形参初始化的机理与变量初始化一样。
和其他变量一样,形参的类型决定了形参和实参交互的方式。如果形参是引用类型它将绑定到对应的实参上;否则,将实参的值拷贝后赋给形参。
当形参是引用类型时,我们说它对应的实参被引用传递(passed by reference) 或者函 数被传引用调用(called by reference)o 和其他引用一样,引用形参也是它绑定的对象的别 名;也就是说,引用形参是它对应的实参的别名。
当实参的值被拷贝给形参时,形参和实参是两个相互独立的对象。我们说这样的实参
被值 传 递 (passed by value) 或者函数被传值调用(called by value)。
传值参数
当初始化一个非引用类型的变量时,初始值被拷贝给变量。此时,对变量的改动不会影响初始值。
传值参数的机理完全一样,函数对形参做的所有操作都不会影响实参。
指针形参
指针的行为和其他非引用类型一样。当执行指针拷贝操作时,拷贝的是指针的值。拷
贝之后,两个指针是不同的指针。因为指针使我们可以间接地访问它所指的对象,所以通
过指针可以修改它所指对象的值。指针形参的行为与之类似
熟 悉 C 的程序员常常使用指针类型的形参访问函数外部的时象:在 C++语言中,建议使用引用类型的形参替代指针。
传引用参数
对于引用的操作实际上是作用在引用所引的对象上。引用形参的行为与之类似。
使用引用避免拷贝
拷贝大的类类型对象或者容器对象比较低效,甚至有的类类型(包括IO类型在内)
根本就不支持拷贝操作。当某种类型不支持拷贝操作时,函数只能通过引用形参访问该类
型的对象。
使用引用形参返回额外信息
一个函数只能返回一个值,然而有时函数需要同时返回多个值,引用形参为我们一次
返回多个结果提供了有效的途径。
一种方法是定义一个新的数据类型,让它包含两个成员。还有另一种更简单的方法,我们可以给函数传入一个额外的引用实参
const形参和实参
和其他初始化过程一样,当用实参初始化形参时会忽略掉顶层const。换句话说,形参的 顶层const被忽略掉了。当形参有顶层const时,传给它常量对象或者非常量对象都是 可以的
在C++语言中,允许我们定义若干具有相同名字的函数,不过前提是不同函数的形参列表
应该有明显的区别。因为顶层const被忽略掉了,所以在上面的代码中传入两个fun 函 数的参数可以完全一样。因此第二个fun 是错误的,尽管形式上有差异,但实际上它的 形参和第一个fun 的形参没什么不同。
void fun(const int i){
/* fun 能够读取 i,但是不能向 i 写值 */}
void fun(int i){
}//错误:重复定义了 fun(int)
在C++语言中,允许我们定义若干具有相同名字的函数,不过前提是不同函数的形参列表
应该有明显的区别。因为顶层const被忽略掉了,所以在上面的代码中传入两个fun 函 数的参数可以完全一样。因此第二个fun 是错误的,尽管形式上有差异,但实际上它的 形参和第一个fun 的形参没什么不同。
指针或引用形参与const
形参的初始化方式和变量的初始化方式是一样的,我们可以使用非常量初始化一个底层co n st对象,但是反过来不行;同 时一个普通的引用必须用同类型的对象初始化。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1nSAdjTv-15901265780