语言定义对象生命周期的方式存在根本差异。在Java和.Net中,在运行任何构造函数之前,将对象成员初始化为零/空,并且此时对象生命周期开始。因此,当您输入构造函数时,您已经有了一个初始化的对象。
在C
++中,对象生存期仅在构造函数完成时开始(尽管成员变量和基类在开始之前已完全构建)。这解释了调用虚函数时的行为,以及在构造函数主体中存在异常的情况下为何不运行析构函数的原因。
Java / .Net对象生存期定义的问题在于,很难确保对象始终满足其不变性,而不必在初始化对象但构造函数未运行时进行特殊处理。C
++定义的问题在于,您有一个奇数时期,其中对象处于不确定状态且未完全构造。



