首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >静态数据成员初始化顺序

静态数据成员初始化顺序
EN

Stack Overflow用户
提问于 2011-12-02 21:29:29
回答 3查看 790关注 0票数 3

将下面的代码放在一个翻译单元中:

代码语言:javascript
复制
class C {
private:

    struct Init {

        Init() {
            /* compute data once here */
        }
    };
    static const Init& i;
    static int data[];
public:
    /* interface for reading data */
};

const C::Init& C::i = Init();
int C::data[200];

  1. 是C::我总是在C::数据之后初始化,不管两者的定义顺序如何?
  2. 这个解决方案是计算静态数据的最优雅的解决方案吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-02 21:40:13

int C::data[200]为零初始化,这意味着它是静态初始化的.静态初始化先于动态初始化。因为C::Init::Init()不是一个常量表达式,所以C::i必须在C::data之后被动态初始化。

详情见3.6.2。

盗录的名言:

具有静态存储持续时间的

变量。在进行任何其他初始化之前,必须为零初始化。..。零初始化和常量初始化一起被称为静态初始化;所有其他初始化都是动态初始化.静态初始化应在进行任何动态初始化之前执行。

票数 6
EN

Stack Overflow用户

发布于 2011-12-02 21:41:54

C::data不是在那里初始化的,所以顺序并不重要。

较短的解决方案是使用静态函数和虚拟变量:

代码语言:javascript
复制
class C {
private:

    static void Init() {
        /* compute data once here */
    }

    static bool data_init_helper;
    static int data[];
public:
    /* interface for reading data */
};

bool C::data_init_helper = (C::Init(), false);
int C::data[200];
票数 0
EN

Stack Overflow用户

发布于 2011-12-02 21:43:15

是C:我总是在C::数据之后初始化,无论两者的定义顺序如何?

如果它们是在同一个编译单元中定义的,则保证顺序,否则不会。

这个解决方案是计算静态数据的最优雅的解决方案吗?

不是的。如果您确实必须让它保持静态,那么更好的方法(并防止可能的静态初始化顺序失败)是这样做:

代码语言:javascript
复制
struct someDataStr
{
  int data[200];
};
someDataStr& AccessData()
{
  static someDataStr *ptr = NULL;
  if ( NULL == ptr )
  {
    ptr = new someDataStr;
    // initialize value
  }
  return *ptr;
}

如果它不必是静态的,那么使用依赖注入,并将包含数据的对象传递给使用它的所有类。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8362921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档