Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 默认构造函数和POD_C++ - Fatal编程技术网

C++ 默认构造函数和POD

C++ 默认构造函数和POD,c++,C++,有一个默认构造函数,一个默认复制构造函数,一个默认析构函数,等等。。(如果我没弄错的话) 我的问题是:在没有隐式构造函数/析构函数等的情况下,如何声明一个只有普通数据(如4个int值)的POD结构。。碍事 我遗漏了什么吗?是的,POD的定义明确排除了隐式生成的特殊成员函数。如果您指定一个与默认生成的类型完全相同的类型,则会变得更加棘手:您的类型不再是POD。在C++11中,这个问题通过default关键字来解决 尽管如此,POD的定义(通常)与C代码中的定义相同: struct X { int

有一个默认构造函数,一个默认复制构造函数,一个默认析构函数,等等。。(如果我没弄错的话)

我的问题是:在没有隐式构造函数/析构函数等的情况下,如何声明一个只有普通数据(如4个int值)的POD结构。。碍事


我遗漏了什么吗?

是的,POD的定义明确排除了隐式生成的特殊成员函数。如果您指定一个与默认生成的类型完全相同的类型,则会变得更加棘手:您的类型不再是POD。在C++11中,这个问题通过
default
关键字来解决

尽管如此,POD的定义(通常)与C代码中的定义相同:

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

首先,所有这些隐式成员函数仅在概念上存在。在你真正尝试使用它们之前,它们不会真正影响任何东西。这意味着,如果你不想让他们“碍事”,他们就不应该“碍事”

其次,非虚拟成员函数(无论是否显式声明)对类的数据布局没有影响。也就是说,他们在这方面没有“碍事”(如果你是这个意思的话)

我如何声明一个POD结构,它只包含普通数据(比如4个int值),而没有隐式构造函数/析构函数等。。碍事

像这样:

struct f {
  int i1, i2, i3, i4;
};
编译器生成的构造函数不会妨碍它成为POD

9班[班] 10) POD struct109是一个非联合类,它既是普通类又是标准布局类,并且没有 非POD结构、非POD union(或此类类型的数组)类型的非静态数据成员。同样,一个 POD联合是一个联合,它既是一个普通类又是一个标准布局类,并且没有非静态数据 非POD结构、非POD union(或此类类型的数组)类型的成员。POD类是一个 POD结构或POD联合

所以,这是必须的

a) 一个微不足道的类和
b) 标准布局类

具体内容如下:

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

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

详情见:

12.1施工人员【施工人员类别】 5) […]如果默认构造函数不是用户提供的,并且:
则默认构造函数是微不足道的 -它的类没有虚拟函数(10.3)和虚拟基类(10.1),并且
-其类的任何非静态数据成员都没有大括号或相等的初始值设定项,
-它的类的所有直接基类都有普通的默认构造函数,
-对于其类的所有类类型(或其数组)的非静态数据成员,每个此类 有一个简单的默认构造函数


由于上述所有条件都适用,该类是一个POD。

每种对象类型都有一个构造函数,否则您将如何构造它?-还有一个析构函数,否则将如何销毁它?它们不会“妨碍”任何事情,因为对于POD-only字段,默认实现是no-ops,正如您所说:

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将复制构造函数标记为已删除或将其声明为私有

还需要注意的是,成员函数并不像成员变量那样存储在对象上。您可以将
结构
同时看作两件事:

  • 数据布局的描述

  • 包含用于操作该数据的函数和类型的命名空间


  • 面向对象编程的C++模型简单地把这两个事物结合在一起。

    “没有隐含的构造函数/析构函数/等等”是什么意思?如果您不需要它们,您可以提供替代方案(用于复制构造函数和复制赋值)和合适的其他构造函数?这是什么意思?我的意思是得到一个没有生成成员的普通吊舱结构functions@JohnnyPauling:生成成员函数的目的是使类的行为与C中的
    结构相同。没有它们,您将无法创建/销毁/复制POD结构。@AndreyT我想他的意思是“去掉f是POD的属性”。他只是缺少了“用户定义”部分。这是针对我的“我是否遗漏了什么”问题。这在技术上是不正确的。默认实现不是no ops-它们初始化非POD成员(在这种情况下不适用)编写空构造函数也不等同于不写它们。通过构造一个构造函数(即使是空的),类型不再是一个POD。@ SRM:这是完全错误的。术语对象在C和C++语言的概念世界中起着非常重要的作用。而且,它与“类实例”无关。每个数据实体T都是。