static在面向过程和面向对象设计中有不同的用法:
- 在面向过程设计中的static应用于普通变量和函数,不涉及类
- 面向对象设计中的static主要说明static在类中的应用
一、面向过程设计中的static
1、静态全局变量
在全局变量前加上static关键字,该变量就被定义成一个静态全局变量。
特点:
- 该变量在全局数据区分配内存
- 未经初始化的静态全局变量会自动初始化为0(非静态变量的值是随机的)
- 静态全局变量只在本文件内可见,而在文件之外是不可见的
优点:
- 静态全局变量不能被别的文件引用,这意味着static可以屏蔽extern关键字
- 在其他文件可以声明具有相同名字的变量,不会发生冲突
2、静态局部变量
在局部变量前加上static关键字,该变量就被定义成一个静态全局变量。
作用:在函数内部定义的变量,会随着函数的退出而消亡,而当加入static关键字后,局部变量并不会随着函数的退出而消亡。
特点:
- 该变量在全局数据区分配内存
- 静态局部变量在程序执行到该对象声明处使初次初始化,即以后的函数调用不再进行初始化
- 如果静态局部变量没有被初始化值,则默认初始化为0
- 它始终停留在全局数据区,直到程序结束,但是其作用域为局部作用域,作用域会随着函数的结束而结束
3、静态函数
在函数的返回值类型前加上static关键字,则该函数则被声明为静态函数。静态函数的作用域仅为本文件,即不能被其他文件调用。
特点:
- 不能被其他文件调用
- 其他文件可以存在同名函数,不会发生冲突
二、面向对象中的static
1、静态数据成员
在类中数据成员声明前加上static关键字,该数据成员就是类中的静态数据成员。
特点:
- 静态数据成员为所有类对象共享。对类的多个对象来说,静态数据成员只分配一次,供所有对象公用。对于任何一个类对象来说,静态数据成员的值都是一样的
- 静态数据成员存储在全局数据区,静态数据成员在定义时要分配内存,因此静态数据成员不能再类内定义
- 静态数据成员必须初始化(类外),并且唯一初始化的方式为:<数据类型> <类名>::<静态数据成员名>=<值>
- 静态数据成员和普通数据成员的访问规则是相同的
- 在没有实例化对象时也可以操作静态数据成员
- 访问静态数据成员有两种方式。1、通过对象。2、通过作用域
2、静态成员函数
静态成员函数和静态数据成员的声明类似,也是在前边加上static关键字即可。同样它对所有类对象有效,而非某个对象,其属于类定义的一部分。
特点:
- 没有this指针
- 可以访问静态的成员函数和数据成员,不可以访问非静态的成员函数和数据成员
- 非静态的成员函数可以访问静态的成员函数和数据成员
- 不能将静态的成员函数设置程虚函数,因为其没有this指针
- 访问方式有两种。1、类对象 2、作用域