静态变量
- 全局变量
- 静态全局变量(static)
- 静态局部变量(static)
- 局部变量
变量 | 存储区域 | 作用域 |
---|---|---|
全局变量 | 内存的静态存储区 | 整个工程文件内都有效 |
静态全局变量 | 内存的静态存储区 | 只在定义它的文件内有效 |
静态局部变量 | 内存的静态存储区 | 只在定义它的函数内有效,并且程序仅分配一次内存,函数返回后,该变量不会消失 |
局部变量 | 内存的栈区 | 在定义它的函数内有效,但是函数返回后失效 |
- 从以上分析可以看出:
- 把 局部变量 改变为 静态局部变量 后,是改变了它的 存储方式 ,即改变了它的生存期
- 把 全局变量 改变为 静态全局变量 后,是改变了它的 作用域 ,限制了它的使用范围
- 注:
- 全局(静态)存储区 分为: DATA 段和 BSS 段。DATA 段(全局初始化区)存放 初始化 的全局变量和静态变量;BSS 段(全局未初始化区)存放 未初始化的全局变量和静态变量。
- BBS段 在程序执行之前会被系统自动 清0,因此,全局变量 和 静态变量 如果没有手工初始化,则由编译器初始化为 0
- 局部变量(自动变量) 放在 栈区,如果没有初始化,则值不可知,是任意的
- 原因: 定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说局部变量定义时如果不显式初始化,值就是脏的
静态函数
- 静态函数 和 普通函数 的区别:
- static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
- 普通函数默认是extern,可以被其它文件调用;静态函数对函数的作用域仅局限于本文件(所以又称内部函数)
- 使用 静态函数 的好处是:
- 静态函数不能被其他文件所用
- 其他文件中可以定义相同名字的函数,不会发生冲突
类的静态成员
- 在类中,静态成员可以实现多个对象之间的 数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性
- 因此,静态成员是类的 所有对象 中 共享 的成员,而不是某个对象的成员
- 对多个对象来说,静态数据成员 只存储一处,供所有对象共用
类的静态函数
- 静态成员函数和静态数据成员一样,它们都属于 类的静态成员,它们都不是对象成员。因此,对静态成员的引用 不需要用对象名
- 在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员 (这点非常重要)
- 如果静态成员函数中要引用非静态成员时,可通过对象来引用
- 从中可看出,调用静态成员函数使用如下格式:<类名>::<静态成员函数名>(<参数表>)