gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:24:41 27 4
gpt4 key购买 nike

在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com