static使用场景: static关键字可以修饰 局部变量、全局变量、 普通函数、成员变量,成员函数。
static修饰内容生命周期及作用域:
1、static修饰局部变量位于函数内时,变量的生命周期并不会随着函数调用结束而终止,只有程序结束时生命周期才正常结束,但变量的作用域只能在本函数中,函数外是不可见的,如下程序会输出0 1 2 3 4 5 6 7 8 9,部分程序如下:
int FunA(){ static int iCnt = 0; return iCnt++; }
int main(int argc, char **argv){
int iExeCnt;
cin >> iExecnt;
for(int iI=0;iI<iExeCnt;iI++){
cout << FunA() << endl;
}
return 0;
}
2、static修饰全局变量,生命周期及作用域是从定义处开始至源文件结束,其它文件该变量不可见,例如在A.cpp中定义了一个全局static 变量sVar, 那么sVar从定义处至A.cpp文件结束都是有效的,但是在其它文件B.cpp中不可见的;
3、static修饰普通函数,生命周期及作用域于修饰全局变量一样;
4、static修饰类数据成员,生命周期与类相同,static修饰的成员变量不属于对象组成部,是属于类组成部分,调用方式类似: 类名::数据成员名、对象.数据成员名、 对象指针->数据成员名;
5、static修饰类成员函数,与修饰类成员数据雷同。
注意事项:static修饰类数据成员时,必须在类定义体外部进行定义(一种情况例外,如果加了const修饰),在类中用static进行声明,在定外 定义时不使用static修饰,不像普通类数据成员,static成员不是通过构造函数进行初始化,而是应该在定义 时进行 初始化的(建议:保证成员正好定义一次的最好办法就是将static数据成员的定义放在包含类非内联成员函数定义的文件中),如下所示定义静态成员 数据及静太成员函数:
int A::m_call = 0; //在外部定义静态成员数据,不能使用static修饰
class A{
public:
static int m_call; //在类中用static进行声明
static const double m_price = 10.0; //加const之后可在类中进行定义及初始化
static int ConnectDB(...){...}; //静态成员只能调用静态成员,不能调用非静态成员
}