默认的构造函数和POD
Default constructors and POD
我得到了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
。
也必须注意,成员函数不会像成员变量一样存储在对象上。您可以同时将class
或struct
视为两件事:
数据布局的描述
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; };
- "error: no matching function for call to"构造函数错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- C++定义构造函数使对象成为非 POD
- 我可以说服自动生成的构造函数将我的 POD 类成员归零吗?
- 在不使用默认构造函数的情况下声明 POD 结构时,会实例化什么?
- 初始化新对象时C++默认构造函数和 POD 问题
- 为什么具有已删除复制构造函数的结构不是 POD 类型
- 构造函数初始化列表中POD类型的初始化
- 非 pod 类型的布局(因为具有默认构造函数)
- 默认的构造函数和POD
- C++11中POD的构造函数要求
- 具有用户定义构造函数的普通和 POD 类型
- POD 类对象初始化是否需要构造函数
- (POD)结构上是否需要移动构造函数
- 默认构造函数、POD初始化和C++11中的隐式类型转换
- 对空的用户定义构造函数将如何初始化非静态非 POD 成员变量感到困惑
- 复制非POD类型的构造函数和普通构造函数
- 迭代器默认构造函数和POD成员初始化
- 从POD结构继承的类中默认构造函数的奇怪行为
- 在POD中强制默认初始化构造函数