C++中static关键字主要在以下场景中用到
一、static修饰全局变量和局部变量
全局变量属于数据,它如果被初始化为0或者不初始化则存放在.bss段,如果初始化不为0,则存放在.data段。如果是字符串常量则存放在.rodata段
1、普通全局变量和static全局变量的区别
(1) 普通的全局变量经过编译之后会产生一个gloab的符号,在链接阶段其他的.obj文件是可以看到的,这样的符号要参与链接过 程的符号解析
(2)static全局变量经过编译之后产生一个local符号,在链接阶段其他的文件不可见,并且也不参与链接过程的符号解析,在多个源文件中定义同名的static全局变量,不会产生重复定义的错误
2、普通局部变量和static局部变量
(1)普通的局部变量属于指令,存放在.text代码码段上,运行时系统给函数在栈上分配空间,此时函数的局部变量也是栈上的一段内存,在函数运行结束后这个栈帧就会回退了
(2)static局部变量属于数据,如果存放在.data或.bss段上,程序一运行起来它就有了内存,第一次运行到它的时候进行初始化,整个进程结束它的内存才会被释放
二、static修饰普通函数
static修饰普通函数和上面static修饰全局变量是一样的,编译之后产生一个local符号,也就是只能在当前.obj文件可见,不参与链接的符号解析,因此其他文件不能链接这个文件中的static函数
三、static修饰成员方法和成员变量
(1)static修饰成员方法后这个成员方法就变成了静态成员方法,它的形参中没有this指针了,也就是说它的调用不再依赖于对象了,调用的时候通过类的作用域来调用就可以了
(2)static修饰成员变量之后这个变量成为了静态成员变量,同样的它的访问通过类的作用域就能够访问,也就是它也不再依赖对象了,此时这个成员变量就不再属于某个对象了,相当于是类作用域下的全局变量