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指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数

非静态成员函数可以任意地访问静态成员函数和静态数据成员。

原文地址:https://www.cnblogs.com/AntonioSu/p/12272189.html