首先,一个词语出来,我们首先会有自己的一些见解:
作用域,域,即地域,作用的地域,在这里,可以理解为作用的范围。
生命周期,即从产生到消亡的一个过程。
下面我们看看百度百科上的解释:
作用域(scope),程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
生命周期,就是指一个对象的生老病死。
接下来,我们带入到程序代码中来看:
变量的作用域:就是你定义的变量可以使用的代码范围
变量的生命周期:指变量在程序执行过程中的“有效期”,比如说全局变量,它在整个程序执行过程中都有效,也就是它的生命周期是整个程序执行过程;而对于一些只在函数里定义的局部变量,它只是在调用函数是有效,函数调用结束,它的生命周期也就结束了。
有的人可能区分不开这两个词,其实他们是不同的两个概念,作用域指使用的范围,生命周期指的是有效期。即作用域定义的是空间,生命周期定义的是时间。
接下来,我们深入了解一下
首先,我们说变量的作用域和生命周期,对象是变量,那么,变量有哪几种呢?
变量可以分为:全局变量,局部变量
全局变量:全局变量也称为外部变量,全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量可以被本程序所有对象或函数引用。
局部变量:局部变量也称为内部变量,指在程序中只在特定过程或函数中可以访问的变量。由某对象或某个函数所创建的变量通常都是局部变量。
局部变量是相对于全局变量而言的。在C++、C#、Ruby这些面向对象语言中,一般只使用局部变量。面向对象编程是现在普遍采用的是软件开发方法,因此无需考虑是局部变量还是全局变量,说到变量,往往都是局部变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
举个栗子:
int a,b; /*外部变量*/
main() /*主函数*/
{
……
}
void f1() /*函数f1*/
{
……
}
void f2(int x,y) /*内部变量*//*函数f2*/
{
……
}
从上例可以看出a、b是在函数外部定义的外部变量,都是全局变量。x、y是在函数内部定义的内部变量,都是全局变量。 a,b定义在源程序最前面,因此在f1,f2及main内不加说明也可使用;如果a,b定义在函数f1前面,要在使用前先声明。x,y是在函数f2内部定义的, 所以它们在f1内无效。所以全局变量a,b的作用域是整个程序,局部变量x,y的作用域是定义该变量的子程序,即函数f2。
说到生命周期,需要引入另外几个概念:静态变量、静态全局变量和静态局部变量
静态变量:在计算机编程领域指在程序执行前系统就为之静态分配(也即在运行时中不再改变分配情况)存储空间的一类变量,与程序有着相同的生命周期的变量。
全局变量与静态全局变量:
全局变量(外部变量)的说明之前再冠以static 就构成了静态全局变量。
作用域:
全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
生命周期:
全局变量与静态全局变量生命周期相同,与整个程序的生命周期一样。
局部变量与静态局部变量:
局部变量(内部变量)的说明之前再冠以static 就构成了静态局部变量。
作用域:
局部变量与静态局部变量只有局部作用域。
生命周期:
静态局部变量虽然属于局部变量,但其生命周期与整个程序的生命周期一样,只不过在用不到的时候不可见。