前言
本文主要介绍C/C++中的static,以及为什么要用static,别人的代码中有时会突然使用用static,看的一脸蒙圈,为什么要用static,我不用难道不行吗?对啊为什么呢?
正文
static是C/C++中一个很重要的关键字,是常见的函数与变量(C++中还包括类)的修饰符,它主要的作用是改变变量的存储方式(局部变量),限制作用域(全局变量、函数、类的成员),实现类的共享资源(类的静态成员变量)。
说到这了不得不拿出一张图
总的来说static就是修饰变量和函数的
它有以下几大特性
1.在函数中声明变量时,static 关键字指定变量只初始化一次,并在之后调用该函数时保留其状态
2.在全局或命名空间范围 (在单个文件范围内声明变量或函数时) static 关键字指定变量或函数为内部链接,从而使得全局变量或函数的作用域变小,即外部文件无法引用该变量或函数
3.static关键字修饰的变量没有赋值时,对于局部变量,它的初始值是未定义的(对于内置类型,在某些情况下编译器可能会将其初始化为0);对于全局变量,会被隐式初始化为0(对于算术类型)或null指针(对于指针类型)(其实不管static是否修饰,全局变量都有这个效果)
4.static修饰局部变量时,不会改变变量的作用域,但是会改变局部变量的存储位置,从而使得局部变量的生命周期变长,即该变量的存储期会变为静态存储期,即它的生命周期贯穿整个程序执行期间
5.静态成员为所有类对象所共享,不属于某个具体的实例
6.静态成员变量,如果它们是常量整型或枚举类型,并且是在类内部声明的,那么可以在类内部进行初始化(C++11及更高版本)。否则,必须在类外部进行初始化
7.静态成员函数没有隐藏的this指针,不能直接访问类的非静态成员变量和成员函数,只能使用静态成员变量
8.静态成员函数可以直接在类内部定义(即实现),而不需要在类外部再次声明(除非有特殊的模板或内联需求)
细分之后可以分成下面四类
1. 修饰局部变量(函数内的变量)
2. 修饰全局变量
注:第二条中所说的:即外部文件无法引用该变量或函数(外部文件指的是外部源文件,即.cpp文件,当静态全局变量定义并声明在单独的.h文件中时它能够被访问)
3. 修饰函数
见二修饰全局变量
4. 修饰类的成员变量和成员函数
静态成员变量必须在类外进行声明初始化,
否则
静态成员函数
为什么要用static
1.保持状态:当你需要函数在多次调用之间保持某些状态时,静态局部变量非常有用
2.在全局作用域中,也可以通过static来限制变量的作用域,使其更像是一个私有的全局变量,而且还可以避免命名冲突。
3.static函数具有内部链接性,因此它们通常用于实现只在特定文件或编译单元内部使用的辅助函数或工具函数。这样做可以减少全局命名空间的污染,并使代码结构更加清晰
4.静态成员函数属于类本身,而不是类的任何特定对象实例。因此,它们不需要通过类的对象来调用,而是可以直接通过类名和作用域解析运算符(::)来调用