C++14中结构体在头文件中的最佳默认初始化方式
C++14中结构体默认初始化的最佳实现方式
原结构体定义如下:
struct ValueStruct { int m_Number; double m_arrValues[10]; };
下面针对给出的两个方案做分析,并给出最佳选择:
方案1:类内成员默认初始化(大括号方式)
实现代码:
struct ValueStruct { int m_Number = -1; double m_arrValues[10] = { -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0 }; };
优缺点
- 优点:代码直观,初始化规则和结构体定义绑定在一起,可读性强;完全符合C++14标准,编译器会自动生成默认构造函数,无需手动编写;保留了结构体的聚合特性,还能兼容聚合初始化写法。
- 缺点:数组元素数量较多时,逐个写初始值会很繁琐,容易出现漏写或计数错误。
方案2:自定义构造函数+循环初始化
实现代码:
struct ValueStruct { int m_Number; double m_arrValues[10]; ValueStruct() : m_Number(-1) { for (auto& val : m_arrValues) { val = -1.0; } } };
优缺点
- 优点:数组初始化逻辑灵活,不管长度多少都能统一处理,后续修改数组长度时无需调整初始化代码,维护性更好。
- 缺点:手写构造函数后,结构体不再是聚合类型,无法使用
ValueStruct v = {1, {2.0, 3.0}};这类聚合初始化写法;代码量比方案1略多,初始化逻辑与成员定义分离。
最佳选择
如果数组长度固定且不大(比如这里的10个元素),方案1是首选——简洁直观,还保留聚合特性,完全贴合C++14的现代初始化风格。
要是数组长度可能变动、或者初始值逻辑复杂,方案2更合适。另外方案2还可以用std::fill简化循环,代码更简洁,但需要包含<algorithm>头文件:
#include <algorithm> struct ValueStruct { int m_Number; double m_arrValues[10]; ValueStruct() : m_Number(-1) { std::fill(std::begin(m_arrValues), std::end(m_arrValues), -1.0); } };
注意这种写法同样会让结构体失去聚合特性。
内容的提问来源于stack exchange,提问作者Avi
相关产品推荐
相关产品推荐

