局部变量
函数参数以及在函数体内定义的变量称为局部变量,例如:
int add(int x, int y) // 函数参数x和y是局部变量
{
int z{ x + y }; // z也是局部变量
return z;
}
局部变量生命周期
函数参数在输入函数时创建和初始化,函数体内的变量在定义点创建和初始化,自然的后续问题是,那么实例化变量何时被销毁?局部变量在定义它的花括号集的末尾以相反的创建顺序被销毁(或者对于函数参数,在函数的末尾)。
例如:
int add(int x, int y) // x和y在这进行创建和初始化
{
int z{ x + y }; //z在这进行初始化
return z;
}//创建的相反顺序,z,y,x依次被销毁。
※:请注意,变量的创建和销毁发生在程序运行时(称为运行时),而不是编译时。因此,生命周期是运行时属性。
稍微复杂的一个例子:
#include <iostream>
int add(int x, int y) //x,y被创建,并进去作用域
{
// x和y仅在此函数中可见/可用
return x + y;
} // y , x 离开作用域,并被销毁
int main()
{
int a{ 5 }; // a被创建并初始化,在这儿进入作用域
int b{ 6 }; // b被创建并初始化,在这儿进入作用域
//a和b仅在此函数中可用
std::cout << add(a, b) << '\n'; // 用x=5和y=6调用函数add()
return 0;
} //b,a 离开作用域,并被销毁
参数x,y 在调用add函数时创建,只能在函数add中看到和使用,在add结束时销毁,变量a和b在函数main中创建,只能在函数main看到和使用,并在main结束时销毁。
以下是程序运行顺序:
- 从main函数开始执行
- main函数中的变量a被创建,初始化为5
- main函数中的变量b被创建,初始化为6
- 使用参数5和6调用add函数
- add函数口的x被创建,初始化为5
- add函数口的y被创建,初始化为6
- operater+运算x+y生成11
- add函数复制11到main调用函数。
- add的y,x依次被销毁
- main函数打印11到控制台
- main函数将0返回到操作系统
- main的函数中的变量b,a依次被销毁
注意,如果函数add被调用两次,参数x和y将被创建和销毁两次,每次调用一次,就要创建和销毁一次。
再来个同名的变量例子:
#include <iostream>
int add(int x, int y)//add 函数中x,y被创建,并进去作用域
{
//add 函数中 x和y仅在此函数中可见/可用
return x + y;
} //add 函数中 y , x 离开作用域,并被销毁
int main()
{
int x{ 5 };// main函数中x被创建并初始化,在这儿进入作用域
int y{ 6 }; //main函数中 y被创建并初始化,在这儿进入作用域
// main's x and y are usable within this function only
std::cout << add(x, y) << '\n'; // calls function add() with x=5 and y=6
return 0;
} //main函数中y,x 离开作用域,并被销毁
挡在main函数中时,名称x,y指的是main的局部范围变量x和y。这些变量只在main函数中看到和使用,同样在add函数内,名称x和y指的是函数参数x和y,他们只能在add内部看到和使用。
简而言之,add和main函数都不知道另一个函数的同名的变量,因为作用域不重叠。所有编译器很清楚x和y在什么时候被使用,销毁。