四种存储类别
- auto:局部变量时默认类别;动态生存期
- static:可用于全局/局部;静态生存期
- extern:全局变量默认类别
- register:寄存器类别,分配内存不够时转化为auto
静态生存期(全局寿命)
- 全局变量所具有的生存期
- 具有全局寿命
- 函数内部想要有全局寿命,需要加上static
static int i;
动态生存期(局部寿命)
- 函数块中声明的,没有加static的对象
- 开始于程序执行到声明点时,结束于命名该标识符的作用域结束处
- 每次进入函数块时,都会初始化
静态局部变量
全局寿命,局部可见
作用域
- 命名空间作用域>类作用域>局部作用域
- 声明类的对象-时命名空间作用域
clock glob;
- 对象的成员函数-类作用域
glob.showtime();
- 复制构造函数声明对象-局部作用域
clock a(glob);//对象a
静态数据成员
- 使数据可以在不同对象之间共享
- 静态数据成员
①初始化:必须在类外进行,不能在类中
int point::count = 0;//数据类型 类名::静态数据成员名=值;
int* ptr = &point::count;//指针创建,指向类的静态成员,类的静态成员使用时要类名::
②调用:类名::静态数据成员//因为不属于任何对象
⚠⚠静态成员≠静态变量
静态成员是类中数据/函数成员
静态变量是函数体中
静态函数成员
- 属于整个类,使函数在类的范围内共享
- 使用:
只能引用属于该类的静态数据和静态函数
class a{
public:
static void f(xx);//f为静态函数
private:
int x;};//x不是静态成员
void a::f(xx){
cout<<x;//×,∵x不是静态成员
cout<<aa.x;//√,通过对象名
- (被用)调用:
①类外可以使用类名和作用域操作符调用函数
②类内共享
//类名::静态成语函数名(实参表)
//对象名.静态成员函数名(实参表)
a.showcount();//对普通函数成员调用必须通过对象名
point::showcount();//⚠与5-4唯一的区别,这里因为是静态函数,类内共享,无需使用对象名
使用静态函数成员的好处:不依赖于任何对象,直接访问静态数据