构造器和析构器同类中定义的方法一样,使用相同的调用规则,但是构造器和析构器有一个附加传递一个Boolean参数(呵呵,奇怪吧,编译器的作为,在类创建前设断点,VIEW CPU,呵呵,看到DL没),用来表示构造器或析构器的上下文关系(context)。
如果构造器读到这个值是FALSE表示构造器是通过实例对象或使用inherited关键字来调用的。在这情况下构造器象一个普通的方法。如果是TRUE表示是通过类引用调用的。在这情况下,构造器创建一个类的实例也就是Self,返回一个新创建的对象的引用在EAX。
同理析构器。。。如果是TRUE,那么析构器在返回前释放类的实例Self的内存。
呵呵,为什么会使用我们上面说的DL寄存器呢,这是因为register调用规则。如果是Pascal规则,那么将在所有其他参数前压入栈。如果是cdecl,stdcall,safecall规则,那么将在Self参数后压入栈。(push dl)
因为DL寄存器表示是否在调用栈中构造器或析构器是最外层,所以必须在退出前恢复DL,这样BeforeDestruction或者AfterConstruction可以被安全调用。
如果构造器读到这个值是FALSE表示构造器是通过实例对象或使用inherited关键字来调用的。在这情况下构造器象一个普通的方法。如果是TRUE表示是通过类引用调用的。在这情况下,构造器创建一个类的实例也就是Self,返回一个新创建的对象的引用在EAX。
同理析构器。。。如果是TRUE,那么析构器在返回前释放类的实例Self的内存。
呵呵,为什么会使用我们上面说的DL寄存器呢,这是因为register调用规则。如果是Pascal规则,那么将在所有其他参数前压入栈。如果是cdecl,stdcall,safecall规则,那么将在Self参数后压入栈。(push dl)
因为DL寄存器表示是否在调用栈中构造器或析构器是最外层,所以必须在退出前恢复DL,这样BeforeDestruction或者AfterConstruction可以被安全调用。