2015-06-21 113 views
5

考虑一个变量由一个.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作品的情况下,与类别,但不能与全球范围内?)

回答

6

static比在C单一的意义更加++ (语言设计者为了减少保留关键字的数量,实际上做了很多事情)。

  • static在一个类意味着它是由类的所有实例共享的变量。

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

+0

我理解正确:每个文件都有自己的这个变量的副本吗?所以,如果OP在哪里把'f1()'和'f2()'放在同一个文件中,那么他实际上会得到'1'和'2'作为输出?而且,如果他没有将'v'声明为'static',那么所有的文件都会共享这个变量,并且输出将会是'1'和'2'? – dingalapadum

+0

@dingalapadum我完全同意第一部分。至于第二部分,并不完全 - 你原则上可能是对的,但在这种情况下,链接器会抱怨有多个定义的变量。 –

+0

我明白了。谢谢! – dingalapadum

1
  1. 关键字static,在class使用时,是指类的成员由所有它的实例共享。因此,每当vclass c中递增时,它将返回一个大于先前值的值。

  2. 但是当在全局空间中使用关键字static时,与对象无关。全局空间中的static表示变量v可从该.cpp文件中进行访问,该文件在其中被声明/定义,并且在其文件中的文件为#include d。无法从其他地方访问。 OOP's中的static与非OOP中的static完全不同。