c++ - 为什么 union 静态成员不存储为 union ?

标签 c++ unions static-members

在 C++ 中,union 可以包含静态成员,在类的情况下,这些成员属于一个类,因此对所有对象都是通用的。

union U
{
   long l;
   int i;
   static long sl;
   static int si;
};

int U::si;
long U::sl;

合乎逻辑的是,所有 union 静态成员都存储在与非静态成员存储类似的同一地址。但事实并非如此。一个简单的例子表明,静态成员存储在不同的地址下,并且可以包含独立 值。

int main()
{
   U u;
   u.si = 10;
   u.sl = 50;

   std::cout << "Non-static members adresses: " << &u.i << " " << &u.l << std::endl;
   std::cout << "Static members adresses: " << &u.si << " " << &u.sl << std::endl;
   std::cout << "Static members values: " << u.si << " " << u.sl << std::endl;
   return 0;
}

输出:

Non-static members adresses: 006FF8EC 006FF8EC
Static members adresses: 00AEB144 00AEB140
Static members values: 10 50

我不明白为什么将独立值存储留在 union 中。我认为这是一种误导,没有任何意义。然而,在我看来,这是有原因的。 union 静态成员的用途是什么?

最佳答案

你可以从两个角度来看这个。

C++ 视角:

union 体首先是一个类。它的目的不同于类,但它由类是什么来告知。

union 是一个类,它的任何一个类型都只有一个子对象是事件的。为此,它改变了 union 的成员子对象的工作方式。这也是 union 不能有基类子对象的部分原因。

静态数据成员不是成员子对象,因此它们在 union 中的配置应该与它们在非 union 类中的配置没有区别。

此外,C++ 中类型的静态成员实际上只是函数和对象名称的作用域机制。它们实际上仍然是全局的,但它们可以是私有(private)的和隐藏的,并且它们必须以其类型名称为前缀以便您使用它们。

union 的静态数据成员的行为与类的静态数据成员的行为没有任何区别。

C++ 必须与 C 兼容的观点:

C 中存在 union ,因此 C++ 也必须有 union 。但是 union 很难在 C++ 对象模型中定义,使用起来很痛苦,还有很多其他问题。因此,您可以将 union 视为 C++ 需要但不愿处理的东西。那么你如何处理它们呢?

在处理 C union 的工作方式时,您可以让 union 像 C 一样工作。 C 中没有静态成员这样的东西,因此没有 C 代码期望组合静态 union 成员。因此......不要将它们结合起来。如果用户真的需要一个静态成员,它是某些类型集的 union 体,他们可以轻松地创建一个 union 体并创建该类型的单个静态成员。

因此用户不会因使静态成员不同而失去任何表达能力。

关于c++ - 为什么 union 静态成员不存储为 union ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55540587/

相关文章:

C++:静态指针、静态对象和动态内存分配

c++ - 使用非静态消息处理程序获取 gstreamer 总线消息

c++ - 为什么我的类构造函数不初始化它的成员变量?

c++ - 如何在 OpenCV 中使用预定义的单应矩阵扭曲图像?

c - c 和缓冲区中的多态性

c++ - 由于 header 中的特化初始化而避免重复符号?

C++ 命名空间导出

c++ - 以优雅的方式进行二进制比较操作

C++ union 用法

C union 位域转换