Jon*_*vis 12
D中的每个类型都有一个默认值.它可以通过类型的init属性访问.int.init,float.init,Object.init,等.在模板类型的情况下,它仍然是init财产.例如,如果你有泛型类型T,那就是T.init.
init通常最接近该类型具有的错误值.对于整数类型,它是0.因为bool,是的false.对于浮点类型,它是NaN.对于角色类型,它是\u00FF.对于引用(即类)和指针,它是null.就结构而言,它的成员变量直接初始化的价值就是它.例如,在
struct S
{
int a = 17;
bool b;
}
Run Code Online (Sandbox Code Playgroud)
S.init是的实例S,其a是17和b是false.特别值得注意的是,对init属性的需求是D中的结构不能具有默认构造函数的原因.它们的默认状态 - 也就是它们的init属性 - 必须在编译时知道,而构造函数将在运行时运行,因此不能使用构造函数创建结构的默认值,因此,虽然结构可以有构造函数,他们不能有默认的构造函数.
对于枚举,init属性取决于它的枚举类型.一个明显的常数,如
enum i = 7;
Run Code Online (Sandbox Code Playgroud)
将具有init与其类型相同的属性(int在本例中),因为您没有真正创建新类型.但是,对于实际创建新类型的枚举,例如
枚举E {a = 7,b = 17};
默认值是枚举中的第一个值.在这种情况下,E.init将是a.
数组是它有点有趣的地方.init动态数组和关联数组的属性是null.但是,为数组分配内存(无论是静态还是动态)时,每个元素都会初始化为其类型的init属性.因此,对于数组,您既有init价值又有init元素价值.
在任何情况下,通用的方式来获得一个类型的默认值是T.init这里T是你想要的默认值的类型-无论是特定类型或模板参数.