static关键字的作用

static关键字的作用:用来控制变量的存储方式和可见性。

1. 全局静态变量

  • 静态变量都在全局数据区分配内存,包括局部静态变量。
  • 未经初始化的全局静态变量会被程序自动初始化为0。(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0)
  • 全局静态变量在声明它的整个文件都是可见的,而在文件之外是不可见的。

优点:在其他文件中可以定义相同名字的变量,不会发生冲突。

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

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

2. 局部静态变量

  • 静态局部变量在全局数据区分配;
  • 静态局部变量在程序执行到该对象的声明处时被首次初始化,以后的函数调用不再进行初始化;
  • 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;
  • 全局静态变量始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

一般程序把新产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间。

静态局部变量也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。

3. 静态函数

  • 在函数返回类型前加static,函数就定义为静态函数。
  • 函数的定义和声明在默认情况下都是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。
  • 静态函数只在本cpp内使用,不会同其他cpp中的同名函数起冲突。

4. 类的静态成员

静态成员属于整个类而不是某个对象,静态成员只存储一份供所有对象共用。静态成员可以使用双冒号老使用即<类名>::<静态成员名>。

5. 类的静态函数

  静态函数属于类的静态成员,不是对象成员。因此,对静态成员的引用不需要用对象名。

  • 不能通过类名来调用类的非静态成员函数。通过类的对象调用静态成员函数和非静态成员函数。
  • 类的对象可以使用静态成员函数和非静态成员函数
  • 静态成员函数不能引用非静态成员。因为静态成员函数属于整个类,在类实例化之前就已经分配空间了,而类的非静态成员必须在类实例化对象后才有内存空间,所以这个调用就出错了,相当于没有声明一个变量却提前使用它一样。
  • 类的非静态成员函数可以调用静态成员函数。
  • 类的静态成员变量必须先初始化再使用。  
原文地址:https://www.cnblogs.com/xiaobaizzz/p/12145068.html