static 关键字 思考

第一个问题: 为什么要引入 static 关键字

一个新东西的引入,一定是为了解决某个实际问题。

static 有以下几个地方使用:

1. 用于函数内部的局部静态变量,此时,它改变了局部变量的生命周期;

比如:

void fun1()                                  void  fun2()

{                                                      {

    int a = 0;                                       static int a = 0;

}                                                      }

函数fun1中,a为普通局部变量,生命周期为函数的生命周期,作用域为定义开始位置至函数结束。

函数fun2中,a为局部静态变量,生命周期为程序的生命周期,作用域为定义开始位置至函数结束。

总结: 局部静态变量改变了生命周期。

 

2. 用于全局的静态变量,此时,它改变了变量的作用域。

比如:

a.cpp头文件中,定义了 全局变量 int m = 0;

此时,全局变量m的作用域为项目作用域, 其他源文件可访问该全局变量;

如果, 此时,改为 全局静态变量  static int m = 0;

那么,全局静态变量的作用域为此源文件,其他源文件不可访问该全局静态变量。

总结: 用于全局的静态变量改变了 作用域。

 

3. 用于类的静态成员变量,它具有类作用域。

比如:

类的多个实例,需要共享某一个变量,此时,可定义一个类的静态变量来满足实现。

类的静态变量共享于每个实例。

 

第二个问题:全局静态变量是否可以定义在头文件中?

这个问题,答案是 可以,也不可以,不建议定义在头文件中,为什么呢?

假设,我把全局变量定义在头文件a.h中,如果只有一个源文件引用该头文件,程序不会报错。

如果有多个源文件引用a.h 头文件,程序会报错,变量多重定义。

最好的方法,全局变量定义在a.cpp源文件中,其他需要引用该全局变量的源文件中,通过extern方式来声明即可。

 

第三个问题: 如果 把 全局静态变量,定义在头文件中,供多个源文件使用,会报错吗?是不是还像全局变量情况一样??

我们知道,如果把全局变量定义在某个头文件中,供多个其他源文件来使用,程序会报错,多重定义。

现在,把全局静态变量定义在头文件中,供多个源文件使用,程序没有报错,可以正常运行!!!

为什么??

全局静态变量被#include 多次,会生成多个局部变量,不会报错,多重定义!!

但是,我们还是不建议 在头文件中定义 全局变量 或是 全局静态变量!!!

先说到这里。

 

 

 

 

 

             

你可能感兴趣的:(c++,static,关键字)