作用
当我们想保留对象中的某个变量的值不释放其内存,以备下次调用,我们最先会想到用全局变量。但是全局变量破坏了面向对象的封装性,当一个变量被定义为全局变量的时候,他将为所有对象所使用,所以为了保证安全,引入了static object(静态对象)。
static修饰后的对象与普通对象不同,其不同体现在生命周期以及存储空间。
- 生命周期:程序编译至程序结束时释放空间为整个生命周期。
- 存储空间:静态对象存储在静态存储空间里。静态存储空间分为两段:DATA段和BSS段。其中DATA段存放已初始化的值,BSS段反之存放未初始化的值。值得注意的是,静态存储空间也存放全局变量。
用法
static修饰普通变量
static修饰普通变量,在main()函数之前就申请了存储空间。如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。
static int a;
static修饰普通函数
static修饰普通函数,表明函数的作用范围,只可在该文件内使用。
static int function(){};
static 修饰成员变量
静态成员引用不需要特定对象。即不需要生成对象就可以访问该成员。但访问前必须在类体外将其初始化。
注:普通对象在声明对象时并不占有空间,只有在实例化对象的时候才为对象申请分配空间。
class A
{
public:
static int a;
A();
};
a = VAL;
static修饰成员函数
静态成员函数不需要对象就可以被引用,反之非静态成员函数必须有特定对象相对。静态成员函数只可以引用静态成员变量。
class A
{
public:
static int a;
A();
static int function1(){};//静态成员函数
int function2(){};//非静态成员函数
};
若是没有相应对象就引用非静态成员函数,报错: