默认的构造函数和POD

Default constructors and POD

本文关键字:POD 构造函数 默认      更新时间:2023-10-16

我得到了pod的含义,我知道,当我将C 中的结构声明为

struct f {};

有一个默认的构造函数,一个默认复制构造函数,一个默认的驱动器等。

我的问题是:我如何在没有隐式构造函数/destructors/等的情况下使用普通数据(例如4个INT值)声明POD结构?

我错过了什么?

每个对象类型都有一个构造函数 - else您将如何构造它?和一个驱动器 - else如何被破坏?他们不会"妨碍"任何事物,因为在纯POD领域的情况下,默认实现是无关的,就像您已经说过:

struct f {
    f() {}
    ~f() {}
    int a, b, c, d;
};

但是,如果您编写一个空构造函数,则类型将变为非pod。C 11用默认设置解决此问题:

f() = default;
~f() = default;

情况与复制构造函数略有不同,其中隐式生成的情况只是一种方便,可以对POD类型进行"正确的事情":

f(const f& other) : a(other.a), b(other.b), c(other.c), d(other.d) {}

没有理由自己重写。如果要使类型不可复制,则可以将复制构造函数标记为用f(const f&) = delete;删除或声明private

也必须注意,成员函数不会像成员变量一样存储在对象上。您可以同时将classstruct视为两件事:

  1. 数据布局的描述

  2. a 命名空间包含功能和类型来操纵该数据

以对象为导向的编程的C 模型简单地将这两件事伴侣在一个地方。

我如何仅使用隐式构造函数/destructors/等的普通数据(例如4个INT值)声明POD结构?

这样:

struct f {
  int i1, i2, i3, i4;
};

编译器生成的构造函数不会阻碍其作为吊舱。

9类[类]

10)POD结构 109 是一个非工会类,既是琐碎的阶层,又是标准的类别,没有 类型非POD结构的非静态数据成员,非POD联合(或此类类型的数组)。同样, Pod Union是一个既是琐碎的阶级又是标准布局类,并且没有非静态数据 类型非POD结构的成员,非POD联合(或此类类型的数组)。Pod类是一个类 POD结构或POD联合。

所以,它必须是

a)琐碎的阶级和
b)标准级别类。

如下所述:

7)标准级别类是:
- 没有类型的非标准 - layout类(或此类类型的数组)或参考的非静态数据成员,
- 没有虚拟函数(10.3),没有虚拟基类(10.1),
- 所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准的基础类,
- 要么在最派生的类中没有非静态数据成员,而且最多有一个基类带有
非静态数据成员,或与非静态数据成员没有基础类别,
- 没有与第一个非静态数据成员相同类型的基本类别。

6)[...]一个琐碎的类是一个具有微不足道的默认构造函数(12.1),并且可复制

详细说明:

12.1构造函数[class.ctor]

5)[...] 如果不是用户提供的,并且如果:
- 它的类没有虚拟函数(10.3),没有虚拟基类(10.1)和
- 其同类的非静态数据成员没有括号或平等的生命器,
- 其类的所有直接基类都具有微不足道的默认构造函数,
- 对于类型(或其数组)的所有类别的非静态数据成员,每个类别 有一个微不足道的默认构造函数。

随着上述所有条件的适用,类是豆荚。

首先,所有这些隐式成员函数仅在概念上存在。直到您实际尝试使用它们之前,不会真正影响任何事情。这意味着,如果您不希望它们,它们不应"妨碍"。

其次,非虚拟成员函数(无论是否明确声明)对类的数据布局没有影响。IE。在这方面,他们并没有"妨碍"(如果这是您的意思)。

是的,POD的定义明确排除了隐式生成的特殊成员函数。如果指定其中一个与默认生成的相同的指定:您的类型不再是pod。在C 11中,使用default关键字解决了此问题。

有了所有这些,POD的定义与C代码中的定义相同:

struct X { int a, b, c, d; };