读书人

static关键字对对象储存期和链接期的影

发布时间: 2012-11-10 10:48:51 作者: rapoo

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
你好,你指的冲突的规则是?

读书人网 >编程

热点推荐