在哪里使用union,class和struct?

时间:2013-01-23 13:56:13

标签: c++ class struct unions

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

我想知道是否有某些特定情况,struct / union / class,或者它们可以互换使用(除了我参加的情况)?如果我错了,请告诉我。 此致

5 个答案:

答案 0 :(得分:5)

我对classstructunion的使用如下:

  • class表示有行为的对象。
  • struct表示被动数据。
  • union表示需要以不同类型访问不同数据的特殊情况。

很久以前我在Google C++ Style guide读过这个(union点除外),从那以后我就跟着它了。

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

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

union

上述功能可以实现重载运算符和转换运算符,但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

答案 1 :(得分:2)

联盟和类或结构完全不同。 union同时是几个东西,比如它可以是一个字符数组和一个整数,而一个类或结构只是一个封装一些逻辑连接信息的东西,也可以是一个用于操作它的逻辑。工会和其他两个用例非常不同。

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

答案 2 :(得分:1)

我从不使用工会。如果你最终看到这个,你最好试试boost变种。我们可以使用它的唯一可接受的情况是我们真的需要对内容进行深入控制,例如自定义序列化。但在很多情况下我会用尽它。

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

答案 3 :(得分:0)

在某些方面,我可以struct使用class

  • 如果我想定义仅包含纯虚方法的接口类型。这符合struct默认为public
  • 的概念
  • 纯数据类型,其中没有与该类型相关联的行为。
  • 政策或特征类型,个人偏好。

union既不是class也不是struct。我只在C中使用它们来创建区分或变体类型,而内存是一个优质的。在C ++中,我没有看到典型应用程序的优势,但仍可用于嵌入式或低内存应用程序。

答案 4 :(得分:0)

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

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