static是c/c++中的关键字,主要有三种用法:(1)局部静态变量2)外部静态变量/函数(3)静态数据成员/成员函数
一、局部静态变量
c/c++局部变量的三种存储形式:auto, static,register
1.auto类型分配在栈上, 属于动态存储类别,占动态存储区空间, 函数调用结束后自动释放
2.而static分配在静态存储区, 在程序整个运行期间都不释放. 两者之间的作用域相同, 但生存期不同.
3.局部静态变量如果不赋初值,编译的时候会自动初始化为0,但是auto的初值就无法确定了。但是对于c++中的额对象而言,不管你是不是static类型,不管你初始化或否,都会调用默认的构造函数。
static函数在他的周期以内,只初始化一次,也就是说,当你初始化后,在调用它的时候,他的值还是保持不变,也不初始化。利用这个特点,可以把static类型的变量作为计数的变量。
使用需要注意的:
1.在上面说的static有记忆其值得功能,但是程序中我们更多要求的是可重用性,所以在使用的时候一定得注意避免因此而产生了不是时期程序运行结果不同的后果。
2.普通的局部变量存储在stack上,每次调用函数的时候,每次调用函数的时候,可能给它分配的空间都不一样,但是static恰好相反,每次调用的时候都指向同一块静态存储区的内存。这样就会导致不可重入。
二外部静态变量/函数
在C中static有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。, 但为了限制全局变量/函数的作用域, 函数或变量前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。注意此时, 对于外部(全局)变量, 不论是否有static限制, 它的存储区域都是在静态存储区, 生存期都是全局的. 此时的static只是起作用域限制作用, 限定作用域在本模块(文件)内部.使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
三、静态数据成员/成员函数
三、静态数据成员/成员函数(C++特有)
C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数. 这是与普通成员函数的最大区别, 也是其应用所在, 比如在对某一个类的对象进行计数时, 计数生成多少个类的实例, 就可以用到静态数据成员. 在这里面, static既不是限定作用域的, 也不是扩展生存期的作用, 而是指示变量/函数在此类中的唯一性. 这也是”属于一个类而不是属于此类的任何特定对象的变量和函数”的含义. 因为它是对整个类来说是唯一的, 因此不可能属于某一个实例对象的. (针对静态数据成员而言, 成员函数不管是否是static, 在内存中只有一个副本, 普通成员函数调用时, 需要传入this指针, static成员函数调用时, 没有this指针. )