我找到了Why/when should I declare a variable using static?,但是这些标记是关于Objective-c的。
当您使用static时,我无法确定c ++和Objective-c的用法细节是否有差异,那么何时/为什么应该在c ++中使用static?
答案 0 :(得分:3)
static
取决于上下文具有几个独立的含义。
void f() { ... }
static void g() { ... }
在这里,f
具有“外部链接”,这意味着其名称在其他翻译单元中可见。也就是说,在另一个源文件中,您可以拥有void f();
,然后可以调用函数f
。
g
被标记为static
,因此具有“内部链接”。您可以从同一源文件中的代码调用它,但不能从另一个源文件中调用它。
与对象相同:
int i = 3; // external linkage
static int j = 4; // internal linkage
还有一个小麻烦:您可以在函数内部定义一个静态对象。
void f() {
static int i = 3;
std::cout << i << '\n';
++i;
}
在这里,i
没有没有链接。它仅在函数内部可见。第一次调用该函数时会对其进行初始化(如果不调用该函数,则不会完全初始化)。因此,第一次调用f
时它将在控制台中写入“ 3”。在第二次调用时,它将写为“ 4”,以此类推。读者应该先了解一下带有析构函数的对象的行为。
在类定义中,它是完全不同的。
class C {
public:
void f();
static void g();
int i;
static int j;
};
在这里,当您调用f
时,必须必须在类型为C
的对象上调用它,并且f
可以使用该对象的数据成员,是,它可以查看并更改i
和j
。调用g
时,没有关联的对象。它仍然是C
的成员,因此它可以查看并更改j
,因为j
也未与任何对象关联。只有一个j
,并且所有C
类型的对象都共享它。