Static 能够被用在一个类或者结构体的内部或者外部。
如果用在外部的话,意味着被你声明成 static 的变量只能作用于该定义的 Translation Unit.
如果用在内部的话,则意味着该 static 变量将会共享该类所有实例的内存空间。即在所有该类的实例中,该变量将只会有一个实例。如果某一个类的实例改变了该变量的值,则所有的类实例中该变量的值都将被改变。
Static 用在类或者结构体的内部
#include <iostream>
struct Entity
{
static int x, y;
static void print()
{
std::cout << x << ", " << y << std::endl;
}
};
int Entity::x;
int Entity::y;
int main()
{
Entity e;
Entity::x = 2;
Entity::y= 3;
Entity e1;
Entity::x = 5;
Entity::y = 8;
e.print();
e1.print();
}
那鉴于 Entity 中所有的变量以及函数都是 static 的,所以我们根本不需要实例化。 那代码可以修改为:
int main()
{
Entity::x = 2;
Entity::y= 3;
Entity::x = 5;
Entity::y = 8;
Entity::print();
}
Static 作用于局部(Local)
首先,定义一个变量我们可以规定了它的作用范围以及生命周期。作用范围意味着哪里可以访问该变量,而生命周期则指该变量会在内存空间中保留多久。Local Static 即表示创建一个生命周期为整个程序,但是作用范围为当前声明该变量的函数,其他的函数并不能访问它 (作用范围可以自己定义)。
依然用例子说明:
#include <iostream>
void Function()
{
int i = 0;
i++;
std::cout << i << std::endl;
}
int main()
{
for (size_t i = 0; i < 5; i++)
{
Function();
}
std::cin.get();
}
该函数的输出结果很显然为 1,1,1,1,1。
但是如果将 i 定义为 static 呢?
#include <iostream>
void Function()
{
static int i = 0;
i++;
std::cout << i << std::endl;
}
int main()
{
for (size_t i = 0; i < 5; i++)
{
Function();
}
std::cin.get();
}
输出结果为 1,2,3,4,5. 这时我们想要的结果。
#include <iostream>
int i = 0;
void Function()
{
i++;
std::cout << i << std::endl;
}
int main()
{
for (size_t i = 0; i < 5; i++)
{
Function();
}
std::cin.get();
}
但此时该变量可以随时在外部被改变。
#include <iostream>
int i = 0;
void Function()
{
i++;
std::cout << i << std::endl;
}
int main()
{
Function();
i = 10;
for (size_t i = 1; i < 5; i++)
{
Function();
}
std::cin.get();
}
输出结果此时为1,11,12,13,14.
如果你并不想要变量 i 的值能够在任意地方被修改,则可以将 i 在函数内部声明为static。