static可以在很多位置发挥作用,下面我来一一讲解它们的作用。
静态局部变量
1.分配空间在静态数据栈上
2.作用域只局限于当前的函数范围内(局部)
3.生命周期为整个程序,不会随着当前的函数结束而结束
4.首次初始化时赋值生效,以后的初始化赋值自动跳过
实例:
void TotalTimes{
static n=10;
cout<<n<<endl;
n++;
}
静态全局变量
(1)静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量;
(2)作用域仅限于当前文件,在其他文件不可用。(若头文件里声明静态变量,include头文件后可用)
(3)未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0);
实例:
//A.cpp
static string niulei="大帅哥";
//B.cpp
cout<<niulei<<endl;//错误
静态全局函数
与静态全局变量类似
//A.cpp
static double getPai(){
return 3.1415926;
}
//B.cpp
double Pai = getPai();//错误
类的静态成员变量
1.存在于静态数据区
2.作用于为整个类,可以直接用类+作用域符调用。
3.所有该类的对象都可以共享。
4.也有public,private,protected的区分
5.若要在类内初始化,除非是static常量;否则要在类内声明,类外初始化,且不能重复static关键字。
实例:
class person{
static string soul = "angel";//错误,不能在类内初始化
static const string soul="angel"//正确,静态常量可以在类内初始化
}
string person::soul="angel";//正确,类外初始化。
person Tom;
person Jerry;
cout<<person::soul<<endl;
cout<<Tom.soul<<endl;
cout<<Jerry.soul<<endl;
类的静态成员函数
(1)静态成员函数和静态数据成员一样,他们都属于类的静态成员,而不是对象成员。
(2)非静态成员函数有this指针,而静态成员函数没有this指针。
(3)静态成员函数主要用来访问静态数据成员而不能访问非静态成员。(但是可以访问全局变量)
int age=24;
class B {
public:
string myName = "niuhuizhe";
static string getName() {
myName = "niulei";//错误,静态成员函数不能访问非静态成员变量
++age;//正确,可以访问全局变量
return oldName;
}
};