首页 > 解决方案 > 零初始化忽略构造函数

问题描述

这个这个关于零初始化的讨论之后,我想澄清一下这两个段落的零初始化 CPP 参考在什么情况下同时出现:

  1. 作为非类类型和没有 构造函数的值初始化类类型成员的值初始化序列的一部分,包括未提供初始化器的聚合元素的值初始化。

从本段中我了解到类成员必须没有构造函数

如果 T 是非联合类类型,则所有基类和非静态数据成员都初始化为零,并且所有填充都初始化为零位。构造函数(如果有)将被忽略。

但是从这个我了解到类成员的构造函数,如果有的话(他们应该没有),被忽略了。

那么,在哪种情况下,我可以为类成员定义一个构造函数并且仍然忽略它的构造函数?我对这两个类AB, 和构造A{}调用进行了实验B()(显然),因为c=1. 只会B() = default;使c=0.

class B
{
public:
    B() : c{1} {}
    int c;
};

class A
{
public:
    A() = default;
    B b;
};

可能吗?先感谢您。

标签: c++constructorinitialization

解决方案


那么,在哪种情况下,我可以为类成员定义一个构造函数并且仍然忽略它的构造函数?

静态存储。具有静态存储持续时间的类实例将在静态初始化阶段初始化为零,该阶段忽略构造函数(如果有)。稍后在动态初始化阶段调用构造函数。

你能举个例子吗?

这是具有静态存储持续时间的类实例的示例:

int main()
{
    static A a;
}

推荐阅读