【问题标题】:when static or dynamic initialization当静态或动态初始化
【发布时间】:2012-02-18 09:51:42
【问题描述】:

是否使用默认构造函数进行初始化(编译器生成) “静态初始化”还是“动态初始化”?

我的意思是在

class test{
  int m;

public :
  test(): m(12) {}

};

test i;

int main()
{//
}

i 何时初始化 - 在编译时还是动态初始化,即在其他文件中使用 i 进行初始化或其他事情是否安全?
如果用户定义了默认构造函数怎么办?

【问题讨论】:

  • 问题的症结在于:“当这些对象具有用户定义的构造函数时,如何初始化全局/命名空间范围对象?”。答案可以在标准的§3.6.2 中找到。在这种情况下,i.m 将静态初始化为零,并动态初始化为 12,但是,如果将默认构造函数声明为 constexpr,则 i.m 将静态初始化为 12。

标签: c++ initialization


【解决方案1】:

由于test有一个构造函数,它会在对象初始化的时候运行。该对象将被放置到初始化为零的内存区域中。您甚至可以通过在对象创建前后使用i.m 初始化值来测试这一点:

extern test i;
int dummy1 = i.m;
test i;
int dummy2 = i.m;

当您打印dummy1dummy2 时,您应该分别得到012。如果你想静态初始化i,你需要使用类似

test i = { 12 };

不过,这只适用于 POD。综上所述,请注意,全球数据总是很糟糕。只是不要打扰并正确地做事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-15
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2011-01-26
    • 2020-02-05
    • 1970-01-01
    相关资源
    最近更新 更多