类和结构之间有一个区别(据我所知),struct
默认为. 然后我才知道有一种类似的数据类型也以类似的方式使用,即. 不能用作继承的基础(我不知道这意味着什么,但我仍然接受它)。public
class
private
union
union
class
我想知道是否有一些特定的实例,在哪里struct
/ union
/ class
,或者它们可以互换使用(除了我入伍的情况)?如果我在某个地方错了,请告诉我。问候
我对class
,struct
的使用union
如下:
class
对于有行为的对象。struct
对于被动数据。union
对于需要以不同类型访问不同数据的非常特殊的情况。我很久以前在Google C++ Style guide中读过这个(除了union
要点),从那时起我就一直在关注它。
使用struct
s 携带被动数据(对象没有附加行为的对象)具有成员默认公开的优点,因此可以在没有 Getter 和 Setter 的情况下访问它们。如果在分配之前需要检查/修改某些成员数据,或者在获取之前需要计算/修改某些成员数据,恕我直言,他们需要一个 Setter/Getter 对,并且对象是 aclass
而不是 a 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
方法对我来说看起来很简洁。
s 也可以是模板化的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);
联合和类或结构是完全不同的。联合同时是几件事情,比如说它既可以是字符数组也可以是整数,而类或结构是封装一些逻辑连接信息以及可选的一些操作逻辑的唯一一件事情。联合和其他两个的用例完全不同。
当我只存储一些数据时,我通常使用一个结构,而如果我还需要一些与之关联的逻辑(即我需要添加方法),我会使用一个类。
我从不使用联合。如果你最终看到这个,你最好试试 boost 变体。我们可以使用它的唯一可接受的情况是当我们确实需要对内容进行深入控制时,例如自定义序列化。但在很多情况下我会用完这个。
此外,结构仅用于存储数据。如果您需要添加任何函数/方法,请将其转换为类。
通常,当访问寄存器时,结构和联合在 C 中一起使用。结构可以定义每个位并允许单独设置寄存器中的每个位。联合将允许同时更改或访问所有位。
即使在 C++ 中,也需要一种方法来设置硬件并写入芯片的寄存器。
在某些领域我可以使用 a struct
over a class
:
struct
默认为public
.union
既不是 a 也不是class
a struct
。在内存非常宝贵的时候,我只在 C 中使用它们来创建区分类型或变体类型。在 C++ 中,我认为在典型应用程序中没有太大优势,但仍可用于嵌入式或低内存应用程序。