1,static修饰局部变量的时候
生命周期与整个程序的生命周期一致,作用域与自动变量相同。退出函数的时候,尽管该变量存在,但是不能使用。
静态局部变量若在未声明的时候未赋予初值,则系统自动赋值为0.
#include <iostream>
#include "extern.h"
using namespace std;
int main()
{
static int a;
int b;
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
result:
0
2130567168
2,static修饰全局变量
非静态全局变量的作用是在整个源程序,在各个源文件都是有效的。
而静态全局变量只作用于该源文件,不能在其他文件被引用。
比如:如果在A文件中定义static int a,再到B文件中定义全局int a就不会报错。相反就不行。
3,static修饰函数:不必担心自己定义函数与其它文件中同名(和全局变量类似,不会发生冲突)
4,static修饰函数静态局部变量:变量存储在全局区,函数退出的时候,变量仍然存储区。
#include <iostream>
using namespace std;
int func()
{
static int a = 5;
int b = 5;
cout<<"static a: "<<++a<<endl;
cout<<"int b: "<<++b<<endl;
return 0;
}
int main()
{
func();
func();
return 0;
}
结果:a是static静态变量一直存储在func中,没有释放,所以会一直累加。
5,类中的static变量:对于非静态数据成员,每个类对象都有自己的拷贝。无论这个类的对象被定义了多少个,静态数据成员在程序也只有一份拷贝。由该类型的所有的对象共享访问。静态数据成员定义时才分配空间,不能在类声明中定义。
对于非静态数据成员,每个类对象都有自己的拷贝,而静态数据成员被当作是类的成员,无论这个类被定义了多少个,静态数据成员只有一份拷贝,为该类型所有对象共享(包括其派生类),所以,静态数据成员的值对每个对象都是一样的,它的值可以更新。因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以它不属于特定的类对象,在没有产生类对象之前就可以用。
#include <iostream>
#include "extern.h"
int main()
{
Cextern ex;
Cextern ex1;
ex.a = 5;
std::cout<<ex.getA()<<" "<<ex.getB()<<std::endl;//5 10
ex.addB();
ex.addA();
std::cout<<ex.getA()<<std::endl;//10
std::cout<<ex.getB()<<std::endl;//20
std::cout<<ex1.getA()<<std::endl;// 随机
std::cout<<ex1.getB()<<std::endl;// 20
return 0;
}
class Cextern
{
public:
int a;
static int b;
int getA()const
{
return a;
};
int getB()const{return b;};
void addB()
{
b+=b;
}
void addA()
{
a+=a;
}
};
int Cextern::b = 10;
6,static修饰成员函数,无法访问属于类对象的非静态数据成员和非静态的成员函数。与普通的成员函数相比,静态成员函数由于不是与任何的对象相联系,因此不具有this指针,从这个意义上来说,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,只能调用其他的静态成员函数。