c++ - 使用非平凡的构造函数初始化 union

标签 c++ constructor multiplatform

我有一个结构,我创建了一个自定义构造函数来将成员初始化为 0。我在较旧的编译器中看到,在 Release模式下,如果不将 memset 设置为 0,则不会初始化这些值。

我现在想在 union 中使用这个结构,但是因为它有一个非平凡的构造函数而出错。

那么,问题 1。默认编译器实现的构造函数是否保证结构的所有成员都将被初始化为空?非平凡的构造函数只是将所有成员的 memset 设置为 '0' 以确保结构清晰。

问题 2:如果必须在基础结构上指定构造函数,如何实现 union 以包含该元素并确保初始化为 0 的基础元素?

最佳答案

问题 1:默认构造函数确实根据 C++ 标准将 POD 成员初始化为 0。请参阅下面的引用文本。

问题 2:如果必须在基类中指定构造函数,则该类不能成为 union 的一部分。

最后,你可以为你的 union 提供一个构造函数:

union U 
{
   A a;
   B b;

   U() { memset( this, 0, sizeof( U ) ); }
};

对于第一季度:

来自 C++03,12.1 构造函数,第 190 页

隐式定义的默认构造函数执行一组初始化 该类将由用户编写的默认构造函数执行,该类具有空的 mem-initializer-list (12.6.2) 和空的函数体。

来自 C++03,8.5 初始化程序,第 145 页

默认初始化 T 类型的对象意味着:

  • 如果 T 是非 POD 类类型 (第 9 条),默认构造函数 对于 T 被称为(和 如果 T 初始化是非良构的 没有可访问的默认值 构造函数);
  • 如果 T 是数组类型,则每个元素都是默认初始化的;
  • 否则,对象将被零初始化

对 T 类型的对象进行零初始化意味着:

  • 如果T是标量类型(3.9),则将对象设置为0(零)的值转换为T;
  • 如果 T 是非 union 类类型,则每个非静态数据成员和每个基类子对象都是零初始化的
  • 如果 T 是 union 类型,则对象的第一个命名数据成员为零初始化;
  • 如果 T 是数组类型,则每个元素都初始化为零;
  • 如果 T 是引用类型,则不执行初始化。

第二季度:

来自 C++03,12.1 构造函数,第 190 页

如果构造函数是隐式声明的默认构造函数并且满足以下条件,则构造函数是微不足道的:

  • 它的类没有虚函数 (10.3) 和虚基类 (10.1),并且
  • 其类的所有直接基类都有普通的构造函数,并且
  • 对于其类的所有类类型(或数组)的非静态数据成员 其中),每个这样的类都有一个简单的构造函数

来自 C++03,9.5 union ,第 162 页

union 可以具有成员函数(包括构造函数和析构函数),但不能具有虚拟 (10.3) 函数。 union 不应有基类。 union 不应用作基类。具有非平凡构造函数 (12.1)、非平凡复制构造函数 (12.8)、非平凡析构函数 (12.4) 或非平凡的类的对象复制赋值运算符(13.5.3、12.8)不能是 union 的成员,也不能是此类对象的数组

关于c++ - 使用非平凡的构造函数初始化 union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/321351/

相关文章:

c++ - 将命令行字符串解析为 argv 格式

c++ - 在 QLineEdit 中更改框架的颜色

使用指向同一类对象的指针的 C++ 类构造函数

c# - 当一个构造函数实现另一个构造函数时有好处还是坏处?

c++ - 在构造函数初始值设定项中使用成员的成员函数

java - 针对各种处理器架构的 native 库位置的最佳实践命名策略

c++ - 构造函数和析构函数必须是虚的?

javascript - 如何在其内部引用 Backbone/Marionette View ?

windows - 双模式可执行吗?

cocos2d-x - 如何用cocos2d-x检测双击