我得到了POD的含义,我知道当我在C++中声明一个结构时
struct f {};
Run Code Online (Sandbox Code Playgroud)
有一个默认的构造函数,一个默认的复制构造函数,一个默认的析构函数等.(如果我得到了这个)
我的问题是:如何在没有隐式构造函数/析构函数等的情况下使用纯数据(如4个int值)声明POD结构.阻碍?
我错过了什么?
每个对象类型都有一个构造函数 - 否则你将如何构造它? - 和析构函数 - 否则它将如何被销毁?他们不会"妨碍"任何事情,因为默认实现在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.
值得注意的是,成员函数不会作为成员变量存储在对象上.你能想到的class或struct为同时两件事情:
数据布局的描述
甲命名空间含有功能和类型用于操纵该数据
面向对象编程的C++模型简单地将这两个东西结合在一起.
如何在没有隐式构造函数/析构函数/等的情况下使用纯数据(如4个int值)声明POD结构..阻碍?
像这样:
struct f {
int i1, i2, i3, i4;
};
Run Code Online (Sandbox Code Playgroud)
编译器生成的构造函数不会妨碍它成为POD.
10)POD结构109是一个非联合类,它既是普通类又是标准布局类,并且没有非POD结构类型的非静态数据成员,非POD联合(或这类类型的数组) ).类似地,POD联合是一个简单类和标准布局类的联合,并且没有非POD结构类型的非静态数据成员,非POD联合(或这种类型的数组).POD类是POD结构或POD联合的类.
所以,必须如此
a)一个简单的类和
b)标准布局类.
如下所述:
7)标准布局类是一个类:
- 没有类型非标准布局类(或此类类型的数组)或引用的非静态数据成员,
- 没有虚函数(10.3)且没有虚拟基础classes(10.1),
- 对所有非静态数据成员具有相同的访问控制(第11条),
- 没有非标准布局基类,
- 在最派生类中没有非静态数据成员,并且大多数具有
非静态数据成员的基类,或者没有具有非静态数据成员的
基类,并且- 没有与第一个非静态数据成员相同类型的基类.
和
6)[...]一个普通的类是一个具有普通默认构造函数(12.1)并且可以轻易复制的类
详细信息:
5)[...] 如果默认构造函数不是用户提供的,则默认构造函数是微不足道的:
- 它的类没有虚函数(10.3),没有虚基类(10.1),
- 没有非静态数据成员它的类有一个大括号或者相等的初始值,并且
- 它的所有直接基类都有简单的默认构造函数,并且
- 对于类的所有非静态数据成员都是类类型(或其数组) ,每个这样的类都有一个普通的默认构造函数.
由于上述所有条件均适用,因此该课程为POD.