NSDMI是C++11引入的特性,允许在类内直接为非静态数据成员指定默认初始值,使用=或{}语法,不支持圆括号初始化;它作为兜底默认值,在构造函数未显式初始化时生效,支持内置及可访问构造函数的类类型,但不支持static、const(非inline)和引用成员。
非静态数据成员初始化(NSDMI,Non-Static Data Member Initialization)是 C++11 引入的语法特性,允许在类定义内部直接为非静态数据成员指定默认初始值,无需等到构造函数体中或成员初始化列表里。
直接在成员声明后使用 = 或 {} 初始化:
注意:不能用圆括号初始化(如 int y(10);),这会被误解析为函数声明(最 vexing parse 问题)。
NSDMI 提供的是“兜底默认值”,当构造函数未在初始化列表中显式初始化该成员时,才生效:
Member(value),NSDMI 被忽略;member = ...;,NSDMI 仍会在进入构造函数体前先执行(即先初始化、再赋值,可能带来额外开销)。NSDMI 支持所有可默认构造或可拷贝/移动初始化的类型,包括自定义类(只要其构造函数可访问):
int, double 等)可直接赋值;this、其他成员或未声明的成员(顺序依赖:只能用前面已声明的成员)。NSDMI 减少重复代码,提升可维护性:
默认值一目了然。基本上就这些。它不复杂但容易忽略细节,用对了能写出更干净、更安全的类。