4

我刚刚从这个Q/A中发现结构在 C++ 中是可继承的,但是,这是一种好的做法,还是最好使用类?在哪些情况下是可取的,在哪些情况下不是?

我从来不需要这个,但现在我有一堆不同类型的消息,但经度相同。我将它们以二进制形式存储在 char 数组中,然后使用 memcpy 将它们复制到结构中以填充其字段(我不知道是否可以使用 std::copy 来完成)。

我想能够从具有公共标头的基本结构继承每个结构会很棒,这就是我搜索它的原因。所以第二个问题是:如果我对类执行此操作,是否可以从缓冲区执行 memcpy(或 std:copy)到类?

4

2 回答 2

5

struct是否可以使用按位复制与or标记无关class,仅取决于是否表示structor class is_trivially_copiable。它们是否在标准(9/6 [类])中定义,它基本上归结为不必声明除构造函数之外的任何其他特殊成员方法

然后在 3.9/2 [basic.types] 中的标准允许按位复制

对于普通可复制 type 的任何对象(基类子对象除外)T,无论该对象是否拥有 type 的有效值T,构成该对象的底层字节(1.7)都可以复制到charor的数组中unsigned charchar如果or的数组的内容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);
于 2012-10-23T07:32:21.623 回答
1

struct和之间的唯一区别class是对其成员的默认访问修饰符。In structit'spublic和 in classit's private(除非另有说明)。除此之外,在 C++ 中是相同的structclass有时,为了便于阅读,PDO(普通数据对象)比类更喜欢结构,但这实际上取决于编码约定。

于 2012-10-23T07:10:05.197 回答