C++ static 字段
1 全局变量
全局变量申明之前冠以static 就构成了静态的全局变量。
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。
全局变量和静态全局变量相同点:
二者都存储在全局区。
全局变量(小)和静态全局变量(大)的作用域不同:
非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
静态全局变量的作用域是只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
2 局部变量
静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区。
内存分配方式参考:https://www.cnblogs.com/AntonioSu/p/12273116.html
3 函数
函数的使用方式与全局变量类似,在函数的返回类型前加上static,就是静态函数。其特性如下:
- 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
- 不同的文件可以使用相同名字的静态函数,互不影响
4 面向对象
A. 静态数据成员
在类内数据成员的声明前加上static关键字,该数据成员就是类内的静态数据成员。
其特点如下:
1)静态数据成员存储在全局数据区,静态数据成员在定义时分配存储空间,所以不能在类声明中定义。
2)静态数据成员是类的成员,无论定义了多少个类的对象,静态数据成员只有一个,且对该类的所有对象可见。也就是说任一对象都可以对静态数据成员进行操作。而对于非静态数据成员,每个对象都有自己的一份拷贝。
3)静态数据成员也遵从public, protected, private访问规则。
由于上面的原因,静态数据成员不属于任何对象,在没有类的实例时其作用域就可见,在没有任何对象时,就可以进行操作。
同全局变量相比,使用静态数据成员有两个优势:
静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性。
可以实现信息隐藏。静态数据成员可以是private成员,而全局变量不能
B. 静态成员函数
与静态数据成员类似,静态成员函数属于整个类,而不是某一个对象。
其特性如下:
静态成员函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数。
非静态成员函数可以任意地访问静态成员函数和静态数据成员。