默认构造函数和POD

Joh*_*ing 3 c++

我得到了POD的含义,我知道当我在C++中声明一个结构时

struct f {};
Run Code Online (Sandbox Code Playgroud)

有一个默认的构造函数,一个默认的复制构造函数,一个默认的析构函数等.(如果我得到了这个)

我的问题是:如何在没有隐式构造函数/析构函数等的情况下使用纯数据(如4个int值)声明POD结构.阻碍?

我错过了什么?

Jon*_*rdy 7

每个对象类型都有一个构造函数 - 否则你将如何构造它? - 和析构函数 - 否则它将如何被销毁?他们不会"妨碍"任何事情,因为默认实现在POD-only字段的情况下是no-ops,就像你说过:

struct f {
    f() {}
    ~f() {}
    int a, b, c, d;
};
Run Code Online (Sandbox Code Playgroud)

但是,如果您编写一个空构造函数,则该类型将变为非POD.C++ 11通过默认解决了这个问题:

f() = default;
~f() = default;
Run Code Online (Sandbox Code Playgroud)

复制构造函数的情况略有不同,其中隐式生成的只是为POD类型做"正确的事情"的便利:

f(const f& other) : a(other.a), b(other.b), c(other.c), d(other.d) {}
Run Code Online (Sandbox Code Playgroud)

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

值得注意的是,成员函数不会作为成员变量存储在对象上.你能想到的classstruct为同时两件事情:

  1. 数据布局的描述

  2. 命名空间含有功能和类型用于操纵该数据

面向对象编程的C++模型简单地将这两个东西结合在一起.

  • 这在技术上是不正确的.默认实现不是no-ops - 它们初始化非POD成员(在这种情况下不适用).另外,编写空构造函数绝不等于不编写它们.通过构造函数(甚至是空),类型不再是POD. (3认同)
  • @srm:完全是错误的。术语“对象”在C和C ++语言的概念世界中起着非常重要的作用。不,它与“类实例”无关。每个占用存储空间的数据实体都是一个对象。每个`int`变量都是一个`int`类型的对象。 (2认同)
  • @srm:嗯... C 和 C++ 是两种标准化良好的语言,具有非常正式和严格的术语。打开 C 标准或 C++ 标准,您将立即找到我所描述的用法。这是 C 标准的引述:“**3.15 对象**:执行环境中的数据存储区域,其内容可以表示值”。你告诉我C“没有对象”?同样,在 C 和 C++ 中,“对象”的概念是最重要的概念之一。不,它与类无关。 (2认同)

Luc*_*ore 5

如何在没有隐式构造函数/析构函数/等的情况下使用纯数据(如4个int值)声明POD结构..阻碍?

像这样:

struct f {
  int i1, i2, i3, i4;
};
Run Code Online (Sandbox Code Playgroud)

编译器生成的构造函数不会妨碍它成为POD.

9个班级[班级]

10)POD结构109是一个非联合类,它既是普通类又是标准布局类,并且没有非POD结构类型的非静态数据成员,非POD联合(或这类类型的数组) ).类似地,POD联合是一个简单类和标准布局类的联合,并且没有非POD结构类型的非静态数据成员,非POD联合(或这种类型的数组).POD类是POD结构或POD联合的类.

所以,必须如此

a)一个简单的类和
b)标准布局类.

如下所述:

7)标准布局类是一个类:
- 没有类型非标准布局类(或此类类型的数组)或引用的非静态数据成员,
- 没有虚函数(10.3)且没有虚拟基础classes(10.1),
- 对所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准布局基类,
- 在最派生类中没有非静态数据成员,并且大多数具有
非静态数据成员的基类,或者没有具有非静态数据成员的
基类,并且- 没有与第一个非静态数据成员相同类型的基类.

6)[...]一个普通的类是一个具有普通默认构造函数(12.1)并且可以轻易复制的类

详细信息:

12.1构造函数[class.ctor]

5)[...] 如果默认构造函数不是用户提供的,则默认构造函数是微不足道的:
- 它的类没有虚函数(10.3),没有虚基类(10.1),
- 没有非静态数据成员它的类有一个大括号或者相等的初始值,并且
- 它的所有直接基类都有简单的默认构造函数,并且
- 对于类的所有非静态数据成员都是类类型(或其数组) ,每个这样的类都有一个普通的默认构造函数.

由于上述所有条件均适用,因此该课程为POD.