C中static的作用大致三种:
首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。
分开来说:
(1)隐藏。这点主要针对静态全局变量和静态函数。对于非静态全局变量的作用域是整个源程序(可能包含多个文件),而静态全局变量则将其作用域限定在本文件内。同理,静态函数也将其作用域限定在本文件内。利用static实现了变量名和函数名的隐藏,从而其他文件内可以有同名函数或变量而不互相影响。static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
(2)持久性。主要针对静态局部变量,把局部变量改变为静态变量后,存储到静态存储区,即改变了它的生存期,作用域不变。static局部变量只被初始化一次。
(3)默认初始化为0。因为全局变量本来默认初始化为0,所以主要针对静态局部变量。
C++中static作用:
除了在面向过程设计中兼容C中特性外,C++中增加的含义体现在面向对象程序设计时,此时static表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。具体的情况为:
(1)类的静态成员变量
在cpp中必须对它进行初始化,如
int Myclass::sum = 0; //初始化静态数据成员,注意该处没有static
如果变量被声明为static,对象将只在执行线程第一次到达它的定义并初始化。
//oop.h
#include<iostream>
using namespace std;
class Myclass
{
private:
int a , b , c;
static int sum; //声明静态数据成员
public:
Myclass(int a , int b , int c);
void GetSum();
};
//oop.cpp
#include "oop.h"
int Myclass::sum = 0; //定义并初始化静态数据成员
Myclass::Myclass(int a , int b , int c)
{
this->a = a;
this->b = b;
this->c = c;
sum += a+b+c;
}
void Myclass::GetSum()
{
cout<<"sum="<<sum<<endl;
}
int main(void)
{
Myclass M(1 , 2 , 3);
M.GetSum();
Myclass N(4 , 5 , 6);
N.GetSum();
M.GetSum();
getchar();
return 0;
}
输出为:6 21 21
(2)类的静态函数
实现的时候也不需要static的修饰;类的静态函数是在该类的范畴内的全局函数,只能访问类的静态成员(变量和函数),不需要类的实例即可调用;实际上,它就是增加了类的访问权限的全局函数。