类和结构之间有一个区别(据我所知),即 struct
默认为 public
和 class
默认到私有(private)
。然后我才知道还有一种类似的数据类型,也以类似的方式使用,那就是union
。 union
不能用作继承中的基类
(我不知道那是什么意思,但我仍然接受)。
我想知道是否有一些特定的实例,其中 struct
/union
/class
,或者它们可以互换使用(除了对于我入伍的案例)?如果我在某个地方错了,请告诉我。
问候
最佳答案
我对 class
、struct
和 union
的使用如下:
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/