static在c++中有两类用法:
- 在面向过程时的用法(同C)
- 在面向对象时的用法
面向过程时的用法
在面向过程时的用法有两种:
- 修饰变量
- 修饰函数
1.修饰变量
修饰变量有什么好处呢?改变作用域和保持变量内容的持久性。
- 可以改变全局变量的作用域(也可以说用于隐藏),因为全局变量在多个文件编译时,是全局可见的,容易造成命名冲突,用static修饰后,只能在本文件中可见。
- 和全局变量一起存储在存储在静态数据区,并且只被初始化一次。静态数据区存储两种变量,static变量和全局变量。
- 修饰局部变量时,变量一直存在知道程序结束,但是只有在它的作用域内才能访问。
注意:
- 在程序刚开始运行时就完成初始化,也是唯一的一次初始化,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的作用域内使用该变量。退出该作用域后, 尽管该变量还继续存在,但不能使用它。
- 如果没有初始化,那么静态(全局,局部)变量的默认值为0;不加static,全局变量的默认值为0;但是局部变量时随机值,也是垃圾值,对我们无用,所以声明局部变量最好初始化。
例如:修饰全局变量的情况
//main.cpp
#include <iostream>
void print();
int main(int argc, char const *argv[])
{
extern int a;
std::cout << a << "\n";
print();
}
//test.cpp
#include <iostream>
int a = 1;
void print(){
std::cout << "函数执行"<<"\n";
}
运行结果:
如果加入a变量static修饰,则会出现
例如:修饰局部的情况
#include <iostream>
int function(){
static int a = 10;
return a--;
}
int main(int argc, char const *argv[])
{
int i = 0;
for(i = 0; i < 10; i++){
std::cout << function() << " ";
}
}
// 输出 10 9 8 7 6 5 4 3 2 1
// 如果a变量去掉static,输出
// 10 10 10 10 10 10 10 10 10 10
// 因为static只初始化一次,作用域为function()函数,生命周期整个程序运行
// 去掉之后每次调用function