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,都具有外部链接期。
- 2楼zw514159799昨天 08:35
- 你好,我对你这个有个疑问!你说静态的类成员变量static int m_j;但是我觉得你用了#include "MyClass.h"这个指令。这个指令应该是在预编译的时候就展开了。如下:n// Another.cpp n17.class MyClass n{ npublic: n // No linkage n int m_i; n // External linkage! n static int m_j; n}; nint main() n{ n MyClass::m_j = 20; n // Compile error below! n // m_i = 1; n // MyClass::m_i = 1; n} n这样的话不就是在同一个编译单元了吗?n跟你说的第二个不冲突啊?
- 1楼tonywearme昨天 22:55
- 你好,你指的冲突的规则是?