函数调用
调用运算符
调用运算符的形式是一对圆括号,它作用于一个表达式,该表达式是函数或者函数指针。调用表达式的类型就是函数的返回类型
调用函数
函数的调用完成两个任务:
- 用实参初始化形参。
- 将控制权从主调函数转移给被调函数,此时,主调函数的执行被暂时中断,被调函数开始执行。
return
语句的执行也完成两个任务:
- 返回
return
语句中的值(如果有的话)。 - 将控制权从被调函数转回到主调函数。
形参与实参
形参与实参:
- 类型必须匹配。
- 数量必须一致。
函数的形参列表
- 定义空的形参列表的两种形式:
void f1(){/*...*/}; // 隐式地定义空形参列表
void f2(void){/*...*/}; // 显式地定义空形参列表
- 两个形参不能重名。
- 形参名是可选的。
局部对象
C++ 中 名字有作用域,对象有生命周期:
- 名字的作用域是程序文本的一部分,名字在其中可见。
- 对象的生命周期是程序执行过程中,该对象存在的一段时间。
函数体是一个语句块,块构成新的作用域:
- 形参和函数体内定义的变量统称为局部变量,仅在函数体内可见。
- 局部变量会隐藏外层作用域中的同名变量。
自动对象和局部静态对象
函数体外定义的对象存在于整个程序执行过程中,此类对象在程序启动时创建,直到程序结束才会被销毁。而局部变量的声明周期则依赖于声明形式:
- 自动对象,把只存在于块执行期间的对象称为自动对象,当块执行结束后,块中创建的自动对象的值就变成未定义的。局部变量对应的自动对象初始化分为两种情况:
- 如果变量本身含有值,就用这个值进行初始化。
- 如果变量本身不含有值,执行默认初始化,对于内置类型未初始化的局部变量将产生未定义的值。
- 局部静态对象,将局部对象定义成
static
类型,局部变量的生命周期就将贯穿函数调用及之后的时间。- 局部静态对象在程序第一次经过对象定义语句时初始化,直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响。
函数声明
- 同其它名字一样,函数的名字在使用之前必须声明,函数声明也称为函数原型。
- 函数只能定义一次,但是可以声明多次。
- 函数的声明与函数的定义十分类似,区别在于函数声明无须函数体,用一个分号代替即可。
- 由于函数声明不需要函数体,所以也无须形参的名字,但是通常为了更好地理解函数作用,还是带上形参的名字。
分离式编译
C++支持分离式编译,所谓分离式编译就是将程序分割到几个文件中,每个文件独立进行编译。