在哪里使用联合、类和结构

Where to use union, class and struct?

本文关键字:结构 在哪里      更新时间:2023-10-16

和结构之间有一个区别(据我所知),struct默认为publicclass默认为private。然后我开始知道有一种类似的数据类型也以类似的方式使用,即unionunion不能用作继承中的基础class(我不知道这意味着什么,但我仍然接受它)。

我想知道是否有一些特定实例,其中struct/union/class,或者它们可以互换使用(我列出的情况除外)?如果我在某个地方错了,请告诉我。问候

我对classstructunion的使用如下:

  • class具有行为的对象。
  • 被动数据的struct
  • union非常特殊的情况,其中不同的数据需要作为不同类型的数据进行访问。

很久以前,我在 Google C++ 风格指南中读过这个(除了union点),从那时起我就一直在关注它。

使用 struct 携带被动数据(没有附加到对象的行为的对象)具有成员的默认公共性的优点,因此可以在没有 Getter 和 setter 的情况下访问它们。如果在分配之前需要检查/修改某些成员数据,或者在获取之前需要计算/修改某些成员数据,恕我直言,他们需要一个 Setter/Getter 对,并且对象是class而不是struct

对于union类型,我发现它对于某种需要对成员进行一些奇怪访问的数据结构很有用,或者需要在某些上下文中将某些成员视为另一种类型。例如 3D 矢量或 IP 地址:

union 3DVector
{
    double x, y, z;
    double vector[3];
} v;
// Acess members with name
v.x = 6.0; v.y = 7.0; v.z = 8.0;
// Acess members as a vector
Normalize(v.vector);
union IPAddress
{
    int binary;
    char octet[4];
} ip;
// Acess the binary address
std::cout << std::hex << ip.binary << 'n';
// Print in a human-readable form
std::cout << static_cast<int>(ip.octet[0]) << '.'
          << static_cast<int>(ip.octet[1]) << '.'
          << static_cast<int>(ip.octet[2]) << '.' 
          << static_cast<int>(ip.octet[3]) << 'n';

上述功能可以实现重载运算符和转换运算符,但union方法对我来说看起来很整洁。

union也可以是模板化的,并且可以具有构造函数/析构函数,这对于序列化目的(不适用于所有类型的对象)可能很有用:

template <typename T> union Serializer
{
    Serializer(const T &o) : object(o) {}
    T object;
    char binary[sizeof(T)];
};
SomePODObject obj; // Only POD objects please!
Serializer s(obj);
SendBuffer(s.binary);

联合和类或结构是完全不同的。联合同时是几个东西,比如说它可以既可以是字符数组又可以是整数,而类或结构是封装一些逻辑连接信息的唯一事物,以及可选的一些用于操作它的逻辑。工会和其他两个的用例完全不同。

当我只存储一些数据时,我通常使用结构,而如果我还需要一些与之关联的逻辑(即我需要添加方法),我会使用一个类。

我从不使用联合。如果你最终看到这个,你最好尝试提升变体。我们可以使用它的唯一可接受的情况是当我们确实需要对内容进行深度控制时,例如自定义序列化。但在许多情况下,我会用完这个。

此外,结构仅用于存储数据。如果需要添加任何函数/方法,请将其转换为类。

在某些方面,我可能会在class上使用struct

  • 如果我想定义一个只包含纯虚拟方法的接口类型。这与struct默认为 public 的概念一致。
  • 纯数据类型,其中没有附加到类型的行为。
  • 政策或特征类型,作为个人偏好。

union既不是class也不是struct.我只在 C 中使用它们来创建区分或变体类型,当时内存非常宝贵。在C++中,我认为在典型应用程序中没有太大优势,但仍然可以用于嵌入式或低内存应用程序。

通常,

当访问寄存器时,结构和联合在 C 中一起使用。 结构可以定义每个位,并允许单独设置寄存器中的每个位。 联合将允许同时更改或访问所有位。

即使在C++也需要一种方法来设置硬件并写入芯片的寄存器。