1、隐藏全局变量
在全局变量/函数前,加上static,就可将其定于成静态全局变量/函数,,加了static的变量/函数只能在同它所在的文件中使用,而未加static的变量/函数可以在其它文件中使用,这样的话static就起到了隐藏的作用
2、修饰函数体内的局部变量
正常的局部变量存在于栈中,随着而在局部变量前加static,就可以声明为静态局部变量,静态局部变量在函数第一次被调用时会初始化,而后函数再次被调用时不会初始化,它会一直存在直到程序结束
静态局部变量一般在声明处初始化,如果没有显示初始化,会自动初始化为0
比如下面代码:
class A {
public:
A(){cout<<'A'<<endl;}
~A(){cout<<"~A"<<endl;}
};
void f1()
{
A a;
cout<<&a<<endl;
}
void f2()
{
static A a;
cout<<&a<<endl;
}
int main()
{
f1();
f1();
f2();
f2();
}
输出:
可见函数中的静态变量确实只初始化一次
3、类的静态成员
类的静态成员存在于任何对象之外,类似的,静态成员函数不与任何对象绑定在一起,所以它不包含this指针,作为结果,静态成员函数不能声明成const,且不能在函数体内使用this指针
类的静态成员不是在创建类的对象时被定义的,这意味着它不是类的构造函数初始化的
一般来说,不能在类的内部初始化静态成员,除非这个成员是const的
如
class A {
public:
static const int a = 10; //编译通过
//static int a = 10; 这样写编译不通过
A(){}
~A(){}
};
静态成员一般在类的外部定义,当在类的外部定义时,不能重复static关键字
class A {
public:
static int a;
A(){}
~A(){}
};
int A::a = 10;
int main()
{
// int A::a = 10; 错误,编译不通过
cout<<A::a<<endl;
cout<<"succ"<<endl;
return 1;
}
对于静态成员函数:
非静态成员函数可以任意地访问 静态成员函数 和 静态成员
静态成员函数可访问 静态成员函数 和 静态成员 ,但不能访问 非静态成员函数 和 非静态成员
调用静态成员函数可以用 类名::函数名调用 去调用