我刚刚从这个Q/A发现结构在C ++中是可继承的,但它是一个好习惯,还是更适合使用类?在哪些情况下是优选的,哪些情况不是?
我从来没有需要这个,但现在我有一堆不同类型但经度相同的消息。我在char数组中以二进制形式获取它们,我只是将它们与memcpy一起复制到结构中以填充其字段(我不知道是否可以使用std :: copy执行此操作)。
我想能够使用公共头继承基础结构中的每个结构都很棒,这就是我搜索它的原因。所以第二个问题是:如果我用类做这个,是否可以从缓冲区到类中执行memcpy(或std:copy)?
答案 0 :(得分:5)
是否可以使用按位复制与struct
或class
标记无关,而只取决于所述struct
或class
{{3 }}。它们是否在标准(9/6 [class])和中定义,它基本上归结为不必声明任何其他特殊成员方法而不是构造函数。
然后标准在3.9 / 2 [basic.types]
中允许按位复制对于普通可复制类型
T
的任何对象(基类子对象除外),无论对象是否包含类型T
的有效值,底层字节(1.7)组成该对象可以复制到char
或unsigned char
的数组中。如果将char
或unsigned char
数组的内容复制回对象,则该对象应随后保持其原始值。 [示例:#define N sizeof(T) char buf[N]; T obj; // obj initialized to its original value std::memcpy(buf, &obj, N); // between these two calls to std::memcpy, // `obj` might be modified std::memcpy(&obj, buf, N); // at this point, each subobject of `obj` // of scalar type holds its original value
- 示例]
注意:填充字节的按位副本将导致Valgrind中的报告。
使用std::copy
来达到同样的效果:
char const* b = reinterpret_cast<char const*>(&obj);
std::copy(b, b + N, buf);
答案 1 :(得分:1)
struct
和class
之间的唯一区别是其成员的默认访问修饰符。在struct
中public
和class
中private
(除非另有说明)。除此之外,struct
和class
在C ++中是相同的。
有时为了可读性,结构体优先于PDO(普通数据对象),但这实际上取决于编码约定。