static关键字对对象存储期和链接期的影响
在看这篇文章之前,先问自己一个问题:加上static关键字后的名字可能拥有外部链接期吗?如果你已经很确定地知道答案,并且和这篇文章的最后结论相同,那么恭喜你,不用看这篇文章了,因为我将要讲的你都知道了。
影响对象的存储期
存储期,又称storage duration,是指变量所占用内存空间的生命期。也就是说,它决定了在整个程序的执行过程中该空间必须存在的时间段。它大于等于对象的生命期。C++03定义的存储期包括static(静态存储期)、dynamic(动态存储期)和automatic(自动存储期)。
static关键字对对象存储期的影响主要反映在局部变量上。
// namespace scope class// MyClass.hclass MyClass{public: // No linkage int m_i; // External linkage! static int m_j;};// MyClass.cpp#include "MyClass.h"int MyClass::m_j = 10;// Another.cpp#include "MyClass.h"int main(){ MyClass::m_j = 20; // Compile error below! // m_i = 1; // MyClass::m_i = 1;}这里,普通的成员变量是没有任何链接期的,因为在它的作用域(class scope)以外无法通过名字m_i去直接访问它。但静态成员变量拥有外部链接期,所以可以直接在其他编译单元中访问,当然前提是加上类名限定(::)。
最后,顺便提一下,成员函数无论加不加static,都具有外部链接期。