静态变量是为了解决什么问题而存在的?
[toc]
对这个问题的补充描述如下:
它提供了什么好处?
有什么场景需要使用到它?
我在搜索引擎搜到的都只是说什么语法方便..
还有编译方面的实现之类的这些内容..
但是我关心的是 它是为了什么而诞生的?
好!好一个只关心为了什么而诞生的!说一下c++
中的静态变量吧!
程序在处理的时候,都是处理数据,或者称之为变量。变量的存储分为动态存储和静态存储。静态存储说的是在程序运行的整个过程中都存在,而动态存储则是在调用函数时临时分配的存储单元。
这么做的好处显而易见,有些变量,我就是希望他是全局的,而有些变量,我希望它随着函数的调用而动态存储和消亡。C++中来处理“静态”这一件事情,用的是static关键字。
对于一个程序,最重要的三大部分就是:变量、函数、类。从而可以细分为对全局变量、对局部变量、对函数、对类成员、对类函数的五种修饰,从而得到全局静态变量、局部静态变量、静态函数、类的静态成员、类的静态函数。
static对变量的修饰
-
对全局变量的修饰,得到全局静态变量,能够使得其作用域在定义的开始处到文件结尾。例如在
a.c
中定义了static int a = 10;
那么在b.c
中用extern int a
是拿不到a
的值的,因为a
的作用域只在a.c
中。这样能够解决文件之间的符号污染问题。 -
对局部变量(栈变量)修饰,得到局部静态变量,将栈变量生命周期延长到程序执行结束时。 也就是说局部静态变量的作用域仍然是在这个函数所定义的局部作用域,离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。未经初始化的局部静态变量,会被自动初始化为
0
。(普通的局部变量分配在栈上,如果没有给定初始化的值的话,会分配一个随机值,并且会随着函数栈帧的释放而被释放掉。)。这么做的用意在于,对于某些局部变量,我们可以保留并使用一些需要的信息,比如记录这个函数被调用了多少次。
static对函数的修饰
在函数返回值类型前加static
,函数就定义为静态函数。函数的定义和声明在默认情况下都是extern
的,但如果用static
修饰的话,与static
修饰全局变量一样,静态函数只能在声明它的文件中可见,不能被其它文件调用。也不会与其它cpp
中的同名函数引起冲突。
static对类的修饰
-
static
对类成员的修饰,得到了类的静态成员。在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性,因此静态成员是类的所有对象中共享的成员,而不是某个对象的成员,对多个对象来说,静态数据成员只存储一处,供所有对象公用。
-
static
对类函数的修饰,得到了类的静态函数。和静态数据成员一样,它们都属于类的静态成员,而不是某个具体对象成员,因此,对于静态成员的调用不需要用对象名。这样也能减少创建多个对象时的一些不必要的开销。
可以看到,静态变量用处强大!!!!