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

时间:2015-06-21 18:15:19

标签: c++

考虑让一个变量由一个.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适用于类但不适用于全局范围?)

2 个答案:

答案 0 :(得分:6)

static在C ++中有不止一个含义(语言设计者实际上做了很多这样的事情,以减少保留关键字的数量)。

    类中的
  • static表示它是该类的所有实例共享的变量。

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

答案 1 :(得分:1)

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

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

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