考虑让一个变量由一个.cpp
文件处理,而其他.cpp
文件则将该变量的值用于各种目的。
与课程一起使用时
// header.h
class c {
public:
static int f1();
static int f2();
private:
static int v;
};
// first.cpp
int c::v(0);
int c::f1() { return ++v; }
// second.cpp
int c::f2() { return ++v; }
// main.cpp
int main() {
cout << c::f1() << endl;
cout << c::f2() << endl;
return 0;
}
输出是:
1
2
在全球范围内使用时
// header.h
int f1();
int f2();
static int v = 0;
// first.cpp
int f1() { return ++v; }
// second.cpp
int f2() { return ++v; }
// main.cpp
int main() {
cout << f1() << endl;
cout << f2() << endl;
return 0;
}
输出是:
1
1
为什么当所述变量在一个类中时,输出是你所期望的,否则它不是? (我知道在第二部分中使用extern
会给出想要的结果,问题是为什么static
适用于类但不适用于全局范围?)
答案 0 :(得分:6)
static
在C ++中有不止一个含义(语言设计者实际上做了很多这样的事情,以减少保留关键字的数量)。
static
表示它是该类的所有实例共享的变量。
static
表示无法在不同的编译单元中进行寻址。在这种情况下,您在标题中写了static
;预处理器(通过``#include`s)将其插入可编译的源文件中。在包含此标头的每个源文件中,它只是意味着这是一个本编译单元的本地变量。
答案 1 :(得分:1)
关键字static
在class
中使用时,表示该类的成员由其所有实例共享。因此,每次v
在class c
中递增时,它都会返回一个大于前一个值的值。
但是当在全局空间中使用关键字static
时,与对象无关。全局空间中的static
表示 ONLY 变量v
可以从声明/定义它的.cpp
文件中以及文件所在的文件中访问是#include
d。并且无法从其他地方访问。
static
与非OOP中的static
完全不同。