6.13 何时调用构造函数与析构函数
构造函数与析构函数是自动调用的。这些函数的调用顺序取决于执行过程进入和离开实例化对象范围的顺序。一般来说,析构函数的调用顺序与构造函数相反。但图6.9将介绍对象存储类可以改变析构函数的调用顺序。
全局范围中定义的对象的构造函数在文件中的任何其他函数(包括 main)执行之前调用(但不同文件之间全局对象构造函数的执行顺序是不确定的)。当main终止或调用exit函数时(见第18章)调用相应的析构函数。
当程序执行到对象定义时,调用自动局部对象的构造函数。该对象的析构函数在对象离开范围时调用(即离开定义对象的块时)。自动对象的构造函数与析构函数在每次对象进人和离开范围时调用。
static 局部对象的构造函数只在程序执行首次到达对象定义时调用一次,对应的析构函数在 main
终止或调用 exit
函数时调用。
图 6.9 的程序演示了 CreateAndDestroy
类型的对象在几种范围中调用构造函数与析构函数的顺序。程序在全局范围中定义 first
,其构造函数在程序开始执行时调用,其析构函数在程序终止时删除所有其他对象之后调用。
1 // Fig. 6,9: create,h
2 // Definition of class CreateAndDestroy.
3 // Member functions defined in create.cpp,
4 #ifndef CREATE_H
5 #define CREATE_H
6
7 class CreateAndDestroy {
8 public:
9 CreateAndDestroy( int ); // constructor
10 ~CreateAndDestroy(); // destructor
11 private:
12 int data;
13 };
14
15 #endif
16 // Fig, 6.9: create.cpp
17 // Member function definitions for class CreateAndDestroy
18 #include <iostream.h>
19 #include "create.h"
20
21 CreateAndDestroy::CreateAndDestroy( int value )
22 {
23 data = value;
24 cout << "Object "<< data <<" constructor";
29 }
26
27 CreateAndDestroy::~CreateAndDestroyO
28 { cout << "Object "<< data <<" destructor "<< endl; }
29 // Fig, 6.9: fig0609.cpp
30 // Demonstrating the order in which constructors and
31 // destructors are called.
32 #include <iostream.h>
39 #include "create.h"
34
35 void create( void ); // prototype
36
37 CreateAndDestroy first( 1 ); // global object
38
39 int main()
4O {
41 cout <<" (global created before main)" << endl;
42
43 CreateAndDestroy second( 2 );
44 cout <<" (local automatic in main)" << endl;
45
46 static CreateAndDestroy third( 3 ); // local object
47 cout <<" (local static in main)" << endl;
48
49 create(); // call function to create objects
50
51 CreateAndDestroy fourth( 4 ); // local object
52 cout <<" (local automatic in main)" << endl;
53 return 0;
54 }
55
56 // Function to create objects
57 void create( void )
58 {
59 CreateAndDestroy fifth( 5 );
60 cout <<" (local automatic in create)" << endl;
61
62 static CreateAndDestroy sixth( 6 );
63 cout <<" (local static in create)" << endl;
64
65 CreateAndDestroy seventh( 7 );
66 cout <<" (local automatic in create)" << endl;
67 }
输出结果:
Object 1 constructor (global creasted before main)
Object 2 constructor (local automatic in main)
Object 3 constructor (local static in main)
Object 5 constructor (local automatic in create)
Object 6 constructor (local static in create)
Object 7 constructor (local automatic in create)
Object 7 destructor
Object 5 destructor
Object 4 constructor (local automatic in main}
Object 4 destructor
Object 2 destructor
Object 6 destructor
Object 3 destructor
Object 1 destructor
图 6.9 调用构造函数与析构函数的顺序
函数 main
声明三个对象。对象 second
和 fourth
是局部自动对象,对象 third
是 static
局部对象。这些对象的构造函数在程序执行到对象定义时调用。对象 fourth
和 second
的析构函数在到达 main
结尾时依次调用。由于对象 third
是 static
局部对象,因此到程序结束时才退出,在程序终止时删除所有其他对象之后和调用 first
的析构函数之前调用对象 third
的析构函数。
函数 create
声明三个对象。对象 fifth
和 seventh
是局部自动对象,对象 sixth
是 static
局部对象。对象 seventh
和 fifth
的析构函数在到达删k结尾时依次调用。由于对象 sixth
是 static
局部对象,因此到程序结束时才退出。 sixth
的析构函数在程序终止时删除所有其他对象之后和调用 third
和 first
的析构函数之前调用。