1、修饰变量
局部静态变量和全局静态变量,都存在内存的静态区
局部静态变量,在函数体内定义,只能在函数内部使用,同一个文件中的其他函数不能用。即使函数运行结束,这个静态变量的值也不会被销毁,函数下次使用时仍能用到这个值。
全局静态变量,在函数外部定义,作用域:从定义处开始,到所在文件结尾处结束,其他文件即使用extern声明也无法使用。
#include "stdafx.h"
#include "iostream"
using namespace std;
static int j;
void fun1(void);
void fun2(void);
void main(void)
{
int k = 0;
for (k = 0; k < 10; k++)
{
fun1();
fun2();
}
}
void fun1(void)
{
static int i = 0;
i++;
cout <<"fun1 " << i << endl;
}
void fun2(void)
{
j = 0;
j++;
cout <<"fun2 " << j << endl;
}
静态全局变量在定义时需要赋初值。
静态局部变量定义时赋初值后,再次调用所在函数,不会运行定义语句。
运行结果如下:
2、修饰函数
函数前加static使函数成为静态函数,静态函数的作用域仅局限于本文件,所以静态函数又称为内部函数。好处是:不同的人编写不同的函数时,不用担心自己所定义的函数是否会与其他文件中的函数同名。
3、C++类的静态成员
一般情况下,类的数据成员在每个对象中都有一个备份,因此,不同对象可以有不同的属性值,称为实例属性;有些情况下,某个数据成员的值对每个对象都是相同的,它对所有对象只有唯一的一个备份,称为类属性。通过静态成员实现类属性。
只需在声明该静态数据成员时以static开头。
公有静态数据成员可以像一般数据成员那样,直接通过对象或在成员函数中访问,也可以通过类名加作用域限定符来访问。
私有和保护静态数据成员,只能在成员函数中访问。
静态数据成员不属于哪一个对象,因此不能在构造函数或其他成员函数中进行初始化,初始化必须在类体外进行。
如:int Person :: m_nCount = 0 ;
有时需要在声明对象之前访问私有静态数据成员,必须定义一个访问静态数据成员的静态成员函数。
定义静态成员函数必须以static开头。静态成员函数与一个类相关联。
静态成员函数可以通过对象、其他成员函数和类名加运算符::调用。
静态成员函数只能访问类的静态成员(成员变量和成员函数),或者将对象作为静态成员函数的参数,然后通过对象访问非静态成员。
静态成员函数没有this指针,因为静态成员函数属于整个类,只有一个运行实例,不需要通过对象,通过类就可以调用。