在哪里使用union,class和struct?

Sum*_*era 2 c++ struct class unions

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

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

Pap*_*ter 5

我的使用class,struct以及union如下:

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

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

使用structs来传递被动数据(没有附加到对象的行为的对象)具有成员默认公共性的优点,因此可以在没有Getters和Setter的情况下访问它们.如果在分配之前需要检查/修改某些成员数据,或者在获取之前需要计算/修改某些成员数据,则恕我直言他们需要一个Setter/Getter对,而对象是a class而不是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';
Run Code Online (Sandbox Code Playgroud)

上述功能可以实现重载运算符和转换运算符,但这种union方法看起来很整洁.

unionS可也作为模板,并可以有构造函数/析构函数,这可能是序列化的目的(并不适用于所有对象的)有用:

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);
Run Code Online (Sandbox Code Playgroud)