c++ - 具有默认值成员的结构的默认和大括号构造函数
问题描述
我想知道在为某些成员指定默认值的情况下,为结构指定 C++ 默认构造函数是否有一些区别:
struct Astruct {
std::vector<double> v; /* has default constructor */
double a;
double b = 100.; /* has default value */
Astruct() = default; /* default constructor */
};
然后以不同的方式初始化变量:
Astruct astruct = Astruct();
Astruct astruct{}; /* is it always the same as above? */
Astruct astruct = {}; /* shouldn't it force the default 'b' to zero? */
Astruct astruct; /* shouldn't it avoid any initialization at all? */
我看到有很多关于编译器生成的构造函数的默认初始化的问题,例如:
但在所有这些问题中,声明的结构都具有没有指定默认值的 POD 类型。
现在,我已经对这些初始化程序进行了一些尝试,我看到例如在new Astruct
(末尾没有括号)中,b
被初始化为我提供的默认值,但a
没有被初始化为零 - 我不会期望默认值值仍然存在,我想知道这是否意味着引入默认值以某种方式改变了默认初始化对结构的 POD 成员的工作方式。
尽管如此,我得到的结果每次运行都会有所不同(有时a
也为零new Astruct
),所以我不能 100% 确信我得到的一切都是由于按照标准保证了初始化,或者由于幸运运行内存已经被零初始化或从以前开始重用。
这四种初始化方式应该发生什么astruct
?Astruct() = default
在将构造函数声明为vs.时,这 4 行中的任何一行的作用会有什么不同Astruct() {}
吗?使用这种编译器生成的构造函数,默认值是否会以某种方式在默认初始化方面有所不同?
解决方案
推荐阅读
- java - 如何解决与 com.android.support 的依赖项冲突?
- javascript - 为什么这个函数的大括号外面有括号,这是什么意思?
- angularjs - Angular 1.4.8 - 如何在 laravel 刀片中使用三元运算符?
- javascript - 创建动态表字段
- java - 如何避免这种宁静的服务请求错误?
- android - 使用 Moshi/Retrofit2 访问深度嵌套的 JSON 数组
- html - 将表头的列与正文对齐时出现问题
- odoo - 为什么这里的代码会创建一个未使用的变量 `context`?
- c - madvise(DODUMP) 在与成功的 madvise(DONTDUMP) 相同的 ptr/size 上失败并显示 EINVAL
- javascript - 如何将 Ant 树设计中的 TreeNode 作为链接?