两个源文件之间的变量(类和全局)

Variable between two source files (class & global)

本文关键字:变量 全局 源文件 两个 之间      更新时间:2023-10-16

考虑有一个由一个.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适用于类而不是全局范围?

static

C++中具有不止一个含义(语言设计者实际上经常这样做,以减少保留关键字的数量)。

  • 类中的static意味着它是类的所有实例共享的变量。

  • static在编译单元中意味着无法在不同的编译单元中寻址它。在本例中,您在标题中写了static;预处理器(通过"#include")将其插入到可编译的源文件中。在包含此标头的每个源文件中,它只是意味着这是此编译单元的本地变量。

  1. 关键字 static ,当在class中使用时,表示该类的成员由它的所有实例共享。所以每次vclass c递增时,它都会返回一个大于前一个值的值。

  2. 但是当关键字static在全局空间中使用时,与对象无关。 全局空间中的static意味着只有变量v可以从声明/定义它的.cpp文件中访问,并且在该文件#include d的文件中访问变量。并且无法从其他地方访问。

  3. OOP中的static与非OOP中的static完全不同。