【问题标题】:Zero initialization ignoring constructor零初始化忽略构造函数
【发布时间】:2021-04-29 23:18:12
【问题描述】:

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

  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++98标准吗?在 C++98 文档中,零初始化总是发生,这是不正确的措辞。
  • Afaik 这适用于 C++11 及更高版本

标签: c++ constructor initialization


【解决方案1】:

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

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

你能举个例子吗?

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

int main()
{
    static A a;
}

【讨论】:

  • 它明确表示“所有基类和非静态数据成员都是零初始化的”。 CPP 文本有误吗?
  • 你能举个例子吗?我一直在尝试不同的方式,但没有任何结果
  • 对不起,我试过了,但还是c=1,这意味着A正在调用B的构造函数。
  • @Victor 是的。这发生在动态初始化阶段。
  • 好吧,那就没有实际效果了,构造函数总是规则并重写值。我害怕它被否决了。顺便说一句,我检查了代码说明,但没有看到 mov 0 的任何 cgodbolt.org/clientstate/…
猜你喜欢
  • 1970-01-01
  • 2018-01-30
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2015-07-13
相关资源
最近更新 更多