面向过程的static
静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。对于一个完整的程序,在内存中的分布情况如下图:
代码区 //low address全局数据区
堆区
栈区 //high address
一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。
1、静态全局变量
static int n;//定义静态全局变量,在函数体外面
void main()
全局变量和全局静态变量的区别:
2)全局静态变量是显式用static修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用extern声明也不能使用。
2、静态局部变量
一个典型的例子就是,计算函数被调用的次数。
3、静态函数
面向对象的static
1、静态数据成员
class myclass{
public:
const static int month=30; //const static数据成员是一个常量表达式,可以用在任何需要常量的地方
double tbl[month]; //这也是可以的,month是一个常量了
}
const int myclass::month; //定义还得在类外
class Myclass
{
private:
int a,b,c;
static int Sum;//声明静态数据成员
};
intMyclass::Sum=0;//在类外面定义并初始化静态数据成员
2、静态成员函数
classMyclass
{
private:
int a,b,c;
static intSum;//声明静态数据成员
static voidGetSum();//声明静态成员函数
};
int Myclass::Sum=0;//在类外面定义并初始化静态数据成员
void Myclass::GetSum() //静态成员函数的实现
{
//cout<<a<<endl;//错误代码,a是非静态数据成员
cout<<"Sum="<<Sum<<endl;
}