C++之static
静态全局变量
控制变量的存储方式和可见性,静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突。即作用域为本文件,全局变量作用域为整个工程。
函数:静态局部变量,静态函数
先来看程序
void text(){
static int a=0;//静态局部变量,即使多次调用,也只分配一次内存空间,即只初始化一次,直到所有程序结束。当然,函数本身只有它被调用的时候才会出现这个变量,当函数调用结束的时候这个静态变量仍存在,并且存在的值是上次调用函数之后变量可能修改后的值。
cout<<a<<endl;
a++;
}
int main(){
text();//第一次调用,输出0
text();//第二次调用,输出1,因为静态局部变量在函数调用结束之后也仍保存上次的状态,其实也就是直到程序结束只分配一次内存资源。
return 0;
}
所以说,当需要存储先前函数状态的情况下使用static很有用。
静态函数:static 修饰一个函数,这个函数只能在本文件中调用,不能被其他文件调用
类:类中的静态变量,静态类成员函数,静态类对象
- 类中的静态数据成员
- 静态类成员函数
- 静态类对象
还是从程序开始:
class Account{
public:
static double m_rate;//静态数据成员,由类对象共享,只分配一次内存资源,因此也不能使用构造函数初始化。
static void set_rate(const double&x){m_rate=x;}//静态成员函数,没有this指针,所以不能访问非static成员。this作为一个隐式参数,时刻指向对象本身。
}
double Account::m_rate=1;//类中的静态变量应由用户使用类外的类名和范围解析运算符显式初始化
int main(){
Account::set_rate(1);//两种调用方式,可以像非静态成员函数一样,或者直接<类名>::<静态成员函数名>。
Account a;
a.set_rate(1);//也可以创建对象来调用
static Account obj;//静态对象的范围贯穿程序的生命周期,参考单例模式
return 0;
}