Che*_*Alf 21
变量的"范围"是源代码的一个区域,您可以在其中引用该变量.
"生命周期"是程序执行期间存在的时间.
默认情况下,局部变量的生命周期与其范围相同:
void foo()
{
int x = 123;
cout << x << endl;
x += 1;
}
int main(){ foo(); foo(); foo(); }
Run Code Online (Sandbox Code Playgroud)
在这里,每次foo调用x都会创建一个new (在堆栈上为它保留空间),并且当执行离开x声明的块时,会x被销毁(这int仅仅意味着保留的空间现在被释放了重复使用).
相反:
void foo()
{
static int x = 123;
cout << x << endl;
x += 1;
}
int main(){ foo(); foo(); foo(); }
Run Code Online (Sandbox Code Playgroud)
这里,因为x声明了static,所以x在程序执行开始之前保留空间.x在内存中有一个固定的位置,它是一个静态变量.C++有关于这种变量初始化的特殊规则:它是在执行第一次通过声明时发生的.
因此,在第一次调用foo这个x被初始化时,输出语句显示123,以及增量增加1的值在接下来的呼叫的初始化被跳过(它已被执行),该值是124输出,并且值再次递增.等等.
这种生命周期x从执行开始到执行结束.
范围是可以访问变量的区域.
生命周期是对象保持有效的时间跨度.
一个简单的例子:
#include <iostream.h>
void doSomething()
{
x = 5; //Error! Not Accessible
}
int main()
{
int x = 4;
std::cout<< x << endl;
{
int x = 2;
cout << x << endl;
}
doSomething();
std::cout<< x << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
以上给出了输出:
4
2
4
在上面的程序
中,变量的生命周期x = 4贯穿整个主程序,即:它在main的执行过程中保持活动状态,也可以在main中访问,即它的范围.请注意,它在函数中不可访问,因为它超出了变量的范围x.
变量的范围和生命周期x = 2在main { }内部的括号中.