static可以限定变量或函数为静态存储。static限定的变量或函数不会和同一程序中其他文件同名的相冲突。如果用static限定内部变量,则该变量从程序一开始就用有内存,不会随其所在函数的调用和退出而分配和消失。其声明的对象的作用域限定为被编译源文件的的剩余部分。
静态函数会被自动分配在一个一直使用的存储区,直到程序结束才从内存消失,避免调用函数时压栈出栈,速度快很多;其他文件可以定义相同名字的函数,不会发生冲突
1.局部静态变量:令局部变量的生命周期贯穿函数调用及之后的时间,只在程序第一次执行到局部静态变量的定义语句时才初始化,直到整个程序结束时才销毁该变量
通俗的来讲,在函数内定义了一个局部变量。他是一个局部变量,意味着这个变量不能在函数外调用,也不能被其他函数直接调用。他是一个静态变量,意味着他所在的函数就算调用完成后,他依旧存在,对他做出的修改依旧保留,直至程序结束。
举个例子可以很好的说明他的作用:
void print(){
static int s = 0;
cout<< ++s<<endl;
}
int main(){
for(int i = 0;i<10;++i)
print();
return 0;
}
上面程序的输出结果为1~10的数字
2.全局静态变量:仅在当前文件下可见(使用)
举个例子,当前你的文件是a.cpp,与另外一个源文件b.cpp链接在一起,如果你在a.cpp中声明了一个全局静态变量
//a.cpp中
static int s = 0;
那么此时在b.cpp中即使已经声明过这个变量,也是无法使用这个变量的
//b.cpp中
extern int s;
意义就在于仅在当前文件可见,其他一同链接的文件不可见
全局变量相反,如在a.cpp中定义的全局变量,在其他一同链接的文件中声明(extern)后,文件中可见,可以使用该变量
3.静态函数:如果把函数声明为static类型,则该函数名除了对该函数声明的文件可见外,其他文件都无法访问
其中很典型的一类就是静态成员函数,即定义在类内的静态函数,该函数属于整个类,而不属于某个实例化的对象,不与任何对象绑定。因此静态成员函数内部不能访问非静态成员变量和非静态成员函数,只能访问静态成员变量和其他静态成员函数。
可以通过类名和域解析运算符(::)来直接调用静态函数
class Cat{
public:
static int mycat();
};
int Cat::mycat(){
}
int main(){
int r = Cat::mycat();
return 0;
}
尽管静态成员函数不属于某个对象,也可以通过类的对象,引用或者指针来访问
class Cat{
public:
static int mycat();
};
int Cat::mycat(){
return 1;
}
int main(){
Cat cat1;
Cat *cat2 = &cat1;
int r;
r = cat1.mycat();
r = cat2->mycat();
return 0;
}