使用了很久的C++中的关键字static,却从未进行过详细的梳理。今天我们将对static关键字进行梳理。
首先我们要对static的特性和作用进行总结
1.存储位置:经过static修饰的变量,在内存中存储在“全局(静态)区”。
我们可以扩展一下,程序在内存中究竟有多少存储区域,每个存储区域都是用来干嘛的。
- 堆区:是由程序员手动申请(new)与释放(delete)的内存区域。从低地址向高地址申请;内存空间大、存储地址不连续,一般是链式的;速度较慢。
- 栈区:由编译器自动分配和释放,主要存储 函数的参数值、函数内部的变量的值、函数调用的空间。从高地址向低地址申请;容量有限;速度较快;存储地址连续,会溢出。
- 代码区:又叫文本段(.text),存放着程序的机器代码,可执行指令就是存储在这里的,这里的代码是只读的。
- 全局区(静态区):全局变量和静态变量是存储在这里的。初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bbs)。系统结束后由系统释放。
- 常量区:常量字符串放在这里,程序结束后,由系统进行释放。
2.生存周期:从程序刚一运行到程序结束。
3.作用域(隐藏作用):被static修饰的变量只能被本模块的所有函数引用。这又叫做它的隐藏功能。
既然static具有隐藏功能,那么在类中定义的变量或者函数,怎么能够让在其他类中访问呢?答案是使用pulic修饰。
- 在类中的静态变量或者函数,属于整个类所有,并不是属于具体类的对象。这里要注意:
- 类的普通成员函数可以访问静态函数可以访问静态变量或者静态方法。
- 静态函数不可以访问类的成员变量或者函数。只能访问静态变量或者静态方法。
- 访问静态变量或者函数应该使用“类名::静态变量(静态函数)”。
那么在使用过程中,会出现一些问题,比如说我们在类中定义一个静态变量,想要在其他类中使用,就像上面3说的,使用public修饰。
因为静态变量或者函数是属于类的,在别处访问需要使用“类名::静态变量(方法)”。所以在其他类中调用这个g_nCount的时候应该是这样的:
然后编译一下,却出现了错误:
这个错误怎么解决呢?我们需要在声明类Demo的.cpp文件的头部进行定义初始化。
这样就能够解决了。