gpt4 book ai didi

c++ - C 风格使用现代 C++ 类

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:06 24 4
gpt4 key购买 nike

我有这样一个类:

片段 1:

struct B
{
int member;
// more complex members e.g. arrays of structs etc
};

假定它是 C 风格的结构(例如用于 memcpymemset 等)

作为良好编程原则的一部分,我正在考虑像这样修改 B:

片段 2

struct B 
{
B() {}
int member;
// more complex members e.g. arrays of structs etc
};

这是我的理解。如果我弄错了请更正一种。代码段 1 定义了 B,它是一个 POD,而代码段 2 定义了 B,它不是一个 POD,并且b.在片段 2 中,B 仍然可以合法地用于 C 风格的用途,例如 memset 和 memcpy

  1. std::is_pod : 假
  2. std::is_trivial : false
  3. std::is_trivially_copyable : true
  4. std::is_trivial : false

扩展,我也会遵循 Big 3(或者可能是 Big 5)的规则,我会添加复制赋值以及复制构造函数。

片段 3:

struct B
{
B() {}
~B(){}
B& operator=(B &){ return *this; }
B(B const &r){}
int member;

// more complex members e.g. arrays of structs etc
};

这是我的理解。如果我弄错了请更正一种。在片段 3 中,B 现在不能再合法地用于 C 风格的用途,例如 memset 和 memcpy

  1. std::is_pod : 假
  2. std::is_trivial : false
  3. std::is_trivially_copyable : false
  4. std::is_trivial : false

我需要了解在代码段 2 和代码段 3 中向 B 添加各种成员对 B 的 C 样式使用的影响。

类的 C 风格使用是真的基于 is_trivially_copyable 还是基于 is_trivial(限制性更强)?

阅读 $3.9/2 向我表明,在 C++11 中,"is_trivially_copyable" 确实是决定性标准。然而,一些旧的 C++ 书籍(例如 C++ 简而言之)表明标准是关于 POD 与非 POD 的,我知道 C++11 规则自那以后发生了变化。

Petes响应似乎表明琐碎是必要的标准

最佳答案

如果您的结构仅包含 POD 数据成员,并且不负责管理任何资源,例如动态分配的内存,则完全没有理由定义析构函数、复制构造函数和赋值运算符。最多我会添加一个构造函数来初始化数据成员。在 C++11 中,这可以使用非静态数据成员初始值设定项轻松完成。

struct B
{
int member = 0; // this will initialize the data member to 0
};

您还可以添加一个采用int 并允许您将member 初始化为任何所需值的构造函数。那样的话

struct B
{
int member;
explicit B(int member = 0) : member(member) {}
};

这两项更改将使您的类易于复制(9/6)和标准布局(9/7),这意味着您将能够使用它们具有 C 风格的函数。


从评论中的讨论来看,您似乎不一定对能够初始化所有数据成员感兴趣,但仍希望提供默认构造函数。

struct B 
{
B() {}
int member;
// more complex members e.g. arrays of structs etc
};

这是个坏主意,因为它没有向类添加任何有用的东西,并使它变得不平凡,因为它现在有一个不平凡的默认构造函数。如果你真的想定义一个默认构造函数,你应该显式地 default 而不是它。

struct B 
{
B() = default;
int member;
// more complex members e.g. arrays of structs etc
};

这使类变得简单和标准布局,允许您将它与 C 样式函数一起使用。

关于c++ - C 风格使用现代 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24103035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com