关键字static

静态成员函数

static修饰类的成员函数,主要用来管理静态数据成员。

  • 静态成员函数的意义,不在于信息共享,而在于管理静态数据成员,完成对静态数据成员的封装;
  • static修饰成员函数和修饰数据成员一样,仅出现在声明处,不出现在定义处;
  • 静态成员函数只能访问静态数据成员而不能访问非静态数据成员。因为非静态数据成员在调用时this指针被当做参数传入。而静态成员函数属于类,而不属于对象,没有this指针;
  • 非静态成员函数可以访问静态成员函数。

静态成员变量

static可以实现在同一个类中,不同对象之间实现数据共享、协调工作。
静态变量有全局变量的优势,但不会被全局变量一样被滥用,而用于管理静态变量。
类的静态成员。属于类,也属于对象,但终究属于类。

在类的数据成员前加上关键字static,类的数据成员就成为静态数据成员,我们主要从五个方面来进行说明:共享、初始化、类大小、存储、访问。

  • 共享
    设置静态数据成员,可以实现在同一个类中,不同对象之间实现数据共享
  • 初始化
    可以分为声明和定义,
    在类内声明,声明格式:static 数据类型 数据变量
    在类外定义,定义格式:数据类型 类名::数据变量=初始化的值
    如果声明和定义是分开的,将定义写到.cpp中
  • 类大小
    static声明的数据成员是不占用对象的大小
  • 存储
    存储在静态存储区data段的ro段。
  • 访问
    可以通过对象访问,也可以通过类名访问。类的静态数据成员,属于类,也属于对象,但终究属于类。

非静态成员函数

static修饰函数的与修饰全局变量十分相似,修饰函数时会改变函数的链接属性,从而使得函数的作用域变小。
一个源文件中的函数,可以被其他源文件中的函数访问(同样需要extern关键字声明)。但当一个源文件中的函数被static修饰成静态函数后,其他源文件无法访问这个静态函数。
静态函数本质和静态全局变量很像:函数本身也是有外部链接属性的,被static修饰后,函数的外部链接属性被修改成内部链接属性,使得这个函数只能在自己的源文件内被使用,禁止在其他源文件中使用,因此静态函数的作用域变小了。
当 static 修饰函数时:
函数的作用域由整个程序变为当前文件。(extern声明也不行)

非静态成员变量(普通变量)

static修饰普通变量有两种情况:全局变量和局部变量。分别从三个方面(存储,初始化和作用域)进行比较:

  • static修饰全局变量(在全局变量前加上一个static关键字,普通全局变量就变成一个静态全局变量)

    • 存储
      静态全局变量都存储在静态存储区(data段的ro段或者BSS段)。未初始化的静态全局变量存储在BSS段。初始化了的静态全局变量存储在data段的ro段,并且静态全局变量和普通全局变量一样,整个程序运行期间会一直存在。
    • 初始化
      未经初始化的全局变量会被系统自动初始化为0。
    • 作用域
      静态全局变量在声明他的文件外是不可见的,使用更加安全。
  • static修饰局部变量
    普通局部变量加上static关键字修饰后,变成静态局部变量。

    • 存储
      静态局部变量存储在静态存储区,和静态全局变量一样,初始化了的静态局部变量存储在data段的ro段,没有初始化的静态局部变量存储在BSS段。
    • 初始化
      未经初始化的全局静态变量会被自动初始化为0。
    • 作用域
      静态局部变量作用域仍然为局部作用域。当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,没有销毁,而是留在内存块中,只是我们不能再对其进行访问。直到函数再次被调用,并且静态局部变量的值是不变的。

你可能感兴趣的:(c++)