在哪里使用联合、类和结构
Where to use union, class and struct?
和结构之间有一个区别(据我所知),struct
默认为public
,class
默认为private
。然后我开始知道有一种类似的数据类型也以类似的方式使用,即union
。union
不能用作继承中的基础class
(我不知道这意味着什么,但我仍然接受它)。
我想知道是否有一些特定实例,其中struct
/union
/class
,或者它们可以互换使用(我列出的情况除外)?如果我在某个地方错了,请告诉我。问候
我对class
、struct
和union
的使用如下:
-
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++也需要一种方法来设置硬件并写入芯片的寄存器。
- C++我需要了解在哪里使用指针和双指针
- 未定义的引用在哪里
- 谷歌测试中的期望值存储在哪里
- 尽管遵循了规则,内存泄漏在哪里
- 静态数据成员模板专用化的实例化点在哪里
- 在哪里放置我的函数?进入我的母语 Gui 还是进入我的演示者?
- 在哪里声明结构运算符重载
- C++ 中的自定义异常:在哪里定义它们?
- 常量参数存储在哪里 (C++)?
- 如何在 c++ 中确定一条指令(以字节为单位)在哪里结束,另一条指令从哪里开始?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 不确定在哪里定义并声明我的结构.(获得未申报的标识符)
- 在哪里可以找到与Clang假设的目录结构相同的mingw32
- “结构ap_conf_vector_t”的定义在哪里
- 指向非指针变量结构的指针。这些变量在哪里,堆还是堆栈?
- Linux gcc:缺少"proc.h"标头。'proc'结构在哪里定义?
- 数据结构的线程安全性,在哪里添加同步原语
- 在哪里声明常量结构数组
- 在哪里使用联合、类和结构