c++ - union 、类和结构在哪里使用?

标签 c++ class struct unions

类和结构之间有一个区别(据我所知),即 struct 默认为 publicclass 默认到私有(private)。然后我才知道还有一种类似的数据类型,也以类似的方式使用,那就是unionunion 不能用作继承中的基(我不知道那是什么意思,但我仍然接受)。

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

最佳答案

我对 classstructunion 的使用如下:

  • class 用于具有行为的对象。
  • struct 用于被动数据。
  • union 适用于需要以不同类型访问不同数据的非常特殊的情况。

我在 Google C++ Style guide 中读过这个(union 点除外)很久以前,从那时起我就一直在关注它。

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

对于 union 类型,我发现它对某些需要对成员进行一些奇怪访问,或者需要将某些成员视为另一个成员的数据结构很有用在某些情况下键入。例如 3D vector 或 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);

关于c++ - union 、类和结构在哪里使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14481469/

相关文章:

c++ - 链表类

c++ - 常量构造器

c++ - 如何在另一个结构中初始化结构数组?

c++ - 加载 Collada 动画关节?

c++ - 使用 -flto 选项的 g++ 错误

c++ - 在 C++ 中监听后如何从同一端口发送数据?

java - 如何从未在 Java 中实例化的类中调用方法?

struct - 如何访问 svg::node::Value 元组结构的单个字符串字段?

c++ - 如何在 C++ 中将结构初始化为 0

从 R 调用时 C++ 程序无法运行(符号查找错误)