第一个问题: 为什么要引入 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 多次,会生成多个局部变量,不会报错,多重定义!!
但是,我们还是不建议 在头文件中定义 全局变量 或是 全局静态变量!!!
先说到这里。