0%

C++ static详解

C++ static静态成员变量和静态成员函数。

巩固回忆一下之前所学。

static

1.类中的静态成员变量

  • 用于在多个对象之间共享数据,对象 a 改变了某份数据后对象 b 可以检测到。

  • static 成员变量属于类,不属于某个具体的对象,即使创建多个对象,也只为该变量分配一份内存,所有对象使用的都是这份内存中的数据。当某个对象修改了改静态变量,也会影响到其他对象。

  • static 成员变量必须在类声明的外部初始化,具体形式为:

1
type class::name = value;

注意:static 成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的 static 成员变量不能使用。

初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化为 0。全局数据区的变量都有默认的初始值 0,而动态数据区(堆区、栈区)变量的默认值是不确定的,一般认为是垃圾值。

static 成员变量不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问。具体来说,static 成员变量和普通的 static 变量类似,都在内存分区中的全局数据区分配内存。

2.类中的静态成员函数

​ 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。

​ 实际上,他就是增加了类的访问权限的全局函数。

3.全局静态变量

  • 在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。

  • 内存中的位置:静态存储区,在整个程序运行期间一直存在。

  • 初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);

  • 作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。

全局变量和全局静态变量的区别

  • 全局变量是不显式用 static 修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过 extern 全局变量名的声明,就可以使用全局变量。
  • 全局静态变量是显式用 static 修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用 extern 声明也不能使用。

4.局部静态变量

  • 在局部变量之前加上关键字static,局部变量就成为一个局部静态变量。

  • 内存中的位置:静态存储区

  • 静态局部变量在程序执行到该对象的声明处时被首次初始化,以后的函数调用不再进行初始化。如果没有显式初始化,会被程序自动初始化为 0。

  • 作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变;