静态和动态初始化示例

时间:2014-06-30 18:41:49

标签: c++ initialization

是否有一个以静态和动态方式初始化变量的示例。即正如规范所述。

  

静态初始化应在任何动态之前执行   初始化发生。

我假设变量可以在同一程序中以静态和动态方式初始化。虽然,我认为,初始化是初始值的定义。即变量,初始化一次,不能再初始化。

1 个答案:

答案 0 :(得分:4)

当然:在任何用户代码运行之前,静态初始化会将所有对象填充为零。

在执行其他初始化程序期间,这些零可能是可见的。阅读"Static Initialization Order Fiasco"

请注意,在动态初始化完成之前,对象不会被视为构造,您必须遵循生命周期规则。标准中的[basic.life]说:

  

对象的生存期是对象的运行时属性。如果一个对象属于类或聚合类型,并且它或其成员之一由除了普通默认构造函数之外的构造函数初始化,则称该对象具有非平凡的初始化。 [注意:通过简单的复制/移动构造函数进行初始化是非平凡的初始化。 - 结束注释]类型为T的对象的生命周期始于:

     
      
  • 获得具有T类型的正确对齐和大小的存储,并且
  •   
  • 如果对象具有非平凡的初始化,则其初始化完成。
  •   

  

本国际标准中归属于对象的属性仅适用于给定对象的生命周期。 [注意:特别是,在对象的生命周期开始之前以及在其生命周期结束之后,对对象的使用存在重大限制,如下所述,在12.6.2和12.7中。此外,正在构建和销毁的对象的行为可能与生命周期已开始但未结束的对象的行为不同。 12.6.2和12.7描述了在构造和破坏阶段期间物体的行为。 - 结束说明]

  

类似地,在对象的生命周期开始之前但是在对象将占用的存储之后,或者在对象的生命周期结束之后以及在重用或释放对象占用的存储之前,任何glvalue可以使用引用原始对象但仅限于有限的方式。对于正在建造或销毁的物体,见12.7。否则,这样的glvalue指的是已分配的存储(3.7.4.2),并且使用不依赖于其值的glvalue的属性是明确定义的。如果出现以下情况,该程序具有未定义的行为:

     
      
  • 左值到左值的转换(4.1)适用于这样的glvalue,
  •   
  • glvalue用于访问非静态数据成员或调用对象的非静态成员函数,或
  •   
  • glvalue绑定到对虚基类(8.5.3)或
  • 的引用   
  • glvalue用作dynamic_cast(5.2.7)的操作数或typeid的操作数。
  •   

因此,访问非基本类型对象的(归零)内容很容易导致未定义的行为。