1. 全局静态变量
全局变量前加上static,全局变量就成了全局静态变量,存储在全局区即静态存储区,如未初始化则存放在BSS段(Block Started by Sysmbol),初始化为0,全局静态变量在声明它的文件之外是不可见的,准确的来说,从定义之处开始,到文件结尾。
2. 局部静态变量
在局部变量之前加上static,局部变量就变成了一个局部静态变量,存储在静态存储区,如未初始化则存放在BSS段(Block Started by Sysmbol),初始化为0,作用域是该代码块内,代码块外不可见。
3. 静态函数
在函数返回类型前加static,函数就定义成了static函数,函数的定义和声明在默认情况下都是extern的,也就是外部可见的,比如外部文件或者外部代码块这种,但是静态函数是外部不可见的,只是在声明他的文件当中可见,函数的实现用static修饰,那么这个函数只能在本cpp中使用,不会和其他cpp中的同名函数引起冲突。
不要在头文件中声明static的全局函数
不要在cpp内声明非static的全局函数
static的函数就不能再叫做全局函数了,外部都使用不了,在cpp内的全局函数声明都最好是static的,避免函数重名的问题,如果想多个cpp文件复用该代码,那就不要在cpp文件内声明了,声明应放到头文件中去。
4. 类的静态成员
类的静态成员可以实现多个对象之间的数据共享,存储在静态存储区,所有对象共用一个静态数据成员,作用域是该类的内部函数。
在C++中为什么一定要先初始化类的静态成员才能使用呢,不是放在静态存储区会自动初始化吗?
- 这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,而不是初始化。
- 初始化是赋一个初始值,而定义是分配内存
- 静态成员变量在类中仅仅是声明,没有定义,所以要在类的外面定义,实际上是给静态成员变量分配内存
5. 类的静态函数
类的静态成员函数和类的静态数据成员是一样的,他们都属于类的静态成员,都不是对象成员
类的静态成员函数不能直接访问类的非静态数据成员
为什么类的静态函数不能访问非静态成员?
- 静态static成员函数不同于非静态函数,它只属于类本身,而不属于每一个对象实例。静态函数随着类的加载而独立存在。与之相反的是非静态成员,他们当且仅当实例化对象之后才存在。也就是说,静态成员函数产生在前,非静态成员函数产生在后,不可能让静态函数去访问一个不存在的东西。
- 在访问非静态变量的时候,用的是this指针;而static静态函数没有this指针,所以静态函数也确实没有办法访问非静态成员。
用什么方法可以间接访问呢?
使用对象来引用即可,通过传参的方式可以间接调用对象的非静态数据成员