1.隐藏
- 无论是函数还是变量,添加static都可以隐藏,即只能在本文件里使用。
- 当同时编译多个文件时,未加static的全局变量和函数都具有全局可见性
static int a = 10;
int b = 11;
static void s()
{
cout << "static s" << endl;
}
void f()
{
cout << "static f" << endl;
}
void f();
int main()
{
extern int b;
cout << b << endl;
f();
}
2.作用域和生命周期
- 添加static的变量在程序一开始就完成初始化,static变量和全局变量一样都存储在静态存储区,直到程序结束
- static和普通变量相同都有作用域,static变量退出作用域之后变量是存在的,只不过不能使用他,
int test()
{
static int a = 10;
return a;
}
int main()
{
int a = 10;
while (a--)
{
cout << a << " " << test() << endl;
}
return 0;
}

3.默认初始化
static int a;
int main()
{
int b;
cout << "a: " << a << endl;
return 0;
}
4.类的static成员
- 类的静态成员属于整个类,即被所有对象共享。
- 类的静态函数没有this指针,所以他只能访问静态成员和静态成员函数。
- 类的静态成员必须在类外初始化。
- 缩短了子类访问父类静态成员的时间,还节省了子类的内存。
- 在子类中定义同名的static变量会屏蔽父类的变量。
class A
{
public:
A(){}
void add()
{
++a;
}
static int aa()
{
return a;
}
private:
static int a;
int b = 0;
};
int A::a = 10;
class B:public A
{
public:
B(){}
};
int main()
{
A b;
b.add();
cout << b.aa() << endl;
A c;
cout << c.aa() << endl;
B d;
cout << d.aa() << endl;
return 0;
}