c++ - 零初始化忽略构造函数
问题描述
在这个和这个关于零初始化的讨论之后,我想澄清一下这两个段落的零初始化 CPP 参考在什么情况下同时出现:
- 作为非类类型和没有 构造函数的值初始化类类型成员的值初始化序列的一部分,包括未提供初始化器的聚合元素的值初始化。
从本段中我了解到类成员必须没有构造函数。
如果 T 是非联合类类型,则所有基类和非静态数据成员都初始化为零,并且所有填充都初始化为零位。构造函数(如果有)将被忽略。
但是从这个我了解到类成员的构造函数,如果有的话(他们应该没有),被忽略了。
那么,在哪种情况下,我可以为类成员定义一个构造函数并且仍然忽略它的构造函数?我对这两个类A
和B
, 和构造A{}
调用进行了实验B()
(显然),因为c=1
. 只会B() = default;
使c=0
.
class B
{
public:
B() : c{1} {}
int c;
};
class A
{
public:
A() = default;
B b;
};
可能吗?先感谢您。
解决方案
那么,在哪种情况下,我可以为类成员定义一个构造函数并且仍然忽略它的构造函数?
静态存储。具有静态存储持续时间的类实例将在静态初始化阶段初始化为零,该阶段忽略构造函数(如果有)。稍后在动态初始化阶段调用构造函数。
你能举个例子吗?
这是具有静态存储持续时间的类实例的示例:
int main()
{
static A a;
}
推荐阅读
- php - 有没有办法为从 SQL 查询生成的 HTML 表中的所有项目添加 PHP 下拉菜单并立即进行所有更改?
- matlab - 查找元素和子集双数组 - matlab
- azure-devops - 具有来自同一分支的多个工件的 Azure DevOps 版本
- javascript - 使用 javascript 在企业架构师中创建批处理标签
- c - 更改结构的成员
- istio - 到 Istio 之外的服务版本的加权流量
- angular - 输入值如何传递给动态 Angular 组件
- android - 如何将两个颤振应用程序集成到单个颤振应用程序中作为单独的模块?
- windows - 使用安装在 WSL 上的 Ansible 设置 windows 10 工作站
- javascript - TypeError:无法读取未定义 React 的属性“forEach”