D 在&;中初始化实例变量之间有什么区别;从一个构造器?

D 在&;中初始化实例变量之间有什么区别;从一个构造器?,d,D,在下面的代码示例中,milk由构造函数初始化,egg不是milk.spill()不会分离故障,但egg.crack()会分离故障。初始化实例变量的两种方法有什么区别?为什么前者是正确的,而后者是错误的 导入标准stdio; void main(){ 自动k=新厨房(); k、 污染(); } 班级厨房{ 牛奶; 蛋=新蛋(); 这(){ 牛奶=新牛奶(); } 无效污染(){ 书面形式(“溢出的牛奶”); 牛奶。溢出(); writeln(“裂蛋”); 鸡蛋。裂开(); } } 等级牛奶{ 布尔

在下面的代码示例中,
milk
由构造函数初始化,
egg
不是
milk.spill()
不会分离故障,但
egg.crack()会分离故障。初始化实例变量的两种方法有什么区别?为什么前者是正确的,而后者是错误的

导入标准stdio;
void main(){
自动k=新厨房();
k、 污染();
}
班级厨房{
牛奶;
蛋=新蛋();
这(){
牛奶=新牛奶();
}
无效污染(){
书面形式(“溢出的牛奶”);
牛奶。溢出();
writeln(“裂蛋”);
鸡蛋。裂开();
}
}
等级牛奶{
布尔溢出=假;
void spill(){spilt=true;}
}
类蛋{
布尔=假;
void crack(){cracked=true;}
}

因此,这两种方法的区别在于运行代码的时间。当您在构造函数中初始化时,代码将在生成每个新对象的运行时运行。当您直接在类成员上执行此操作时,对象实际上是在编译时构造的,并且是静态引用的

在您的示例中,这意味着为每个厨房对象创建了一个新的Milk对象。当您运行
newkitchen
时,构造函数将运行,这意味着您也会得到一份
newmilk

Egg
是不同的。它在静态上下文中,所以初始化器在编译时只运行一次。这意味着所有的
新厨房
只共享一个
鸡蛋。变量本身不是静态的,如果在创建
新厨房后的某个时间将其分配给
新鸡蛋
,它只会影响厨房的实例,但它引用的对象立即是静态的


因此,如果您只是在构造函数外部将其设置为
new Egg
,并且从不替换它,那么您对该Egg所做的任何修改都将在厨房的所有实例中可见-在您打碎鸡蛋后,再进行另一次
new kitchen
,它将已经有一个破裂的鸡蛋了

您确定提供了正确的示例吗?它起作用了。也许你是想去掉«=新鸡蛋();»part?egg.crack不应该在那里出现故障,对我来说也不应该。这两行代码之间有一个区别,一个让人困惑的重要区别,我可以写出来,但是你的示例代码对我来说很有用。这对你来说也是一个错误,还是这是一个更大的事情的摘录?我也曾经有过这个问题。社区是如何向我解释这一切的:@AdamD.Ruppe,是的,当使用GDC5.2.1编译时,这段代码始终存在错误。因为你说它不适合你,所以我用LDC 0.14.0再次尝试了它,它确实运行了,没有分段故障。