17.12 Destructors

原创 2006年05月21日 02:53:00
A destructor is a member that implements the actions required to destruct an
instance of a class. A destructor is
declared using a destructor-declaration:
attributesopt externopt ~ identifier ( ) destructor-body
A destructor-declaration may include a set of attributes (§24).
The identifier of a destructor-declarator must name the class in which the
destructor is declared. If any other
name is specified, a compile-time error occurs.
When a destructor declaration includes an extern modifier, the destructor
is said to be an external destructor.
Because an external destructor declaration provides no actual
implementation, its destructor-body consists of a
semicolon. For all other destructors, the destructor-body consists of a
block, which specifies the statements to
execute in order to destruct an instance of the class. A destructor-body
corresponds exactly to the method-body of
an instance method with a void return type (§17.5.8).
Destructors are not inherited. Thus, a class has no destructors other than
the one which may be declared in that
[Note: Since a destructor is required to have no parameters, it cannot be
overloaded, so a class can have, at most,
one destructor. end note]
Destructors are invoked automatically, and cannot be invoked explicitly. An
instance becomes eligible for
destruction when it is no longer possible for any code to use that
instance. Execution of the destructor for the
instance may occur at any time after the instance becomes eligible for
destruction. When an instance is
destructed, the destructors in that instance?s inheritance chain are
called, in order, from most derived to least
derived [Example: The output of the example
Chapter 17 Classes
using System;
class A
~A() {
Console.WriteLine("A’s destructor");
class B: A
~B() {
Console.WriteLine("B’s destructor");
class Test
static void Main() {
B b = new B();
b = null;
B?s destructor
A?s destructor
since destructors in an inheritance chain are called in order, from most
derived to least derived. The GC.Collect
method is not required, but may be provided by an implementation. end
Destructors may be implemented by overriding the virtual method Finalize on
System.Object. In any event,
C# programs are not permitted to override this method or call it (or
overrides of it) directly. [Example: For
instance, the program
class A
override protected void Finalize() {} // error
public void F() {
this.Finalize(); // error
contains two errors. end example]
The compiler behaves as if this method, and overrides of it, does not exist
at all. [Example: Thus, this program:
class A
void Finalize() {} // permitted
is valid and the method shown hides System.Object?s Finalize method. end
For a discussion of the behavior when an exception is thrown from a
destructor, see §23.3.


Item 7 (多态中基类的虚析构函数)Declare destructors virtual in polymorphic base classes

看评注版的书的确有点吃力,作为一个英语渣,很多单词都要请教谷歌娘。但是细细的看下去,虽然看上去是个简单的问题,但作者想到的东西却如此之多,还是收获良多的。     先把书上最后的总结心得Mark下,再...

Constructors and Destructors in C++

原文地址:http://www.cprogramming.com/tutorial/constructor_destructor_ordering.html Constructors and Des...

More effective c++ 11(禁止异常(exceptions)流出destructors之外)

当对象被exception处理机制------也就是exception传播过程中的stack------unwinding(栈展开)机制-----销毁。    当destructor被调用时,可能有一...

C++ Chapter 2. Constructors, Destructors, and Assignment Operators

1.compilers will declare their own versions of a copy constructor, a copy assignment operator, and a...

Destructors That Throw and Why They're Evil

Solution This brings us to a key topic, namely the innocent looking delete[] p;. What does it r...

CPP-Constructor, destructors and inheritance

Constructor, destructors and inheritance 和别的对象类似,导出类的对象也能够用构造函数初始化。当调用构造函数时候,从基类继承过来的数据成员也必须初始化。这个通...
  • 2015-10-15 05:38
  • 243

EC之Constructors,Destructors, and Assignment Operators

条款05:Know what function C++ silently writes and calls 如果没有显式声明,编译器会自动为class创建default构造函数、copy构造函数、co...