c++ - C++ 为什么成员没有默认初始化?
问题描述
如果我有一个 struct Foo 和一个 struct Bar:
struct Foo {
int a, b;
};
struct Bar {
Foo foo;
int c;
};
如果我初始化 aBar
并打印我正确得到的值:
int main() {
Bar bar = {}; // I call the default constructor
std::cout << bar.foo.a << " "; // 0
std::cout << bar.foo.b << " "; // 0
std::cout << bar.c << std::endl; // 0
return 0;
}
但是现在如果我声明一个这样的构造函数:
struct Bar {
Bar() : c(5) {}
Foo foo;
int c;
};
我失去了默认构造Bar::foo
和程序输出32764 0 5
!
为什么我不得不像这样愚蠢地初始化每个成员变量:
struct Bar {
Bar() : c(5) {}
Foo foo{};
int c;
};
只要我声明一个构造函数?为什么在这种情况下默认构造不起作用?
解决方案
在 C++ 中,如果您有一个默认构造函数,并且变量没有使用初始化列表进行初始化,那么它默认构造为一个不确定的值。这是一个尚未修复的值得注意的行为,所以我认为它要么是有意的,要么更有可能被接受。
来自CPP 参考:
笔记
具有自动和动态存储持续时间的非类变量的默认初始化产生具有不确定值的对象(静态和线程局部对象初始化为零)
引用和 const 标量对象不能默认初始化。
推荐阅读
- c# - .net 核心 UI 访问 API,具有基于策略的授权
- php - 如何将谷歌标签管理器和分析上传到完全在 PHP 上运行的网站?
- postgresql - 相对于 Select 的 PostgreSQL 性能更新
- jenkins - Rush 构建错误 - [Errno 2] 没有这样的文件或目录:'build:ts'
- python - 将字典转换为数据框
- php - 搜索多个 sql 字段
- django - 在 Django formset 模态表中设置默认条目数
- c++ - Rcpp、RcppArmadillo:可以通过引用传递的类
- selenium - HEADCHR_PERMISSIONS 的 Python Selenium 不一致
- javascript - 如何获取选定年份中每个月的开始和结束时间戳