Các constructor và destructor được gọi một cách tựđộng. Thứ tự các hàm này được gọi phụ thuộc vào thứ tự trong đó sự thực hiện vào và rời khỏi phạm vi mà các đối tượng được khởi tạo. Một cách tổng quát, các destructor được gọi theo thứ tự ngược với thứ tự của các constructor được gọi.
Các constructor được gọi của các đối tượng khai báo trong phạm vi toàn cục trước bất kỳ hàm nào (bao gồm hàm main()) trong file mà bắt đầu thực hiện. Các destructor tương ứng được gọi khi hàm main() kết thúc hoặc hàm exit()được gọi.
Các constructor của các đối tượng cục bộ tựđộng được gọi khi sự thực hiện đến điểm mà các đối tượng
được khai báo. Các destructor tương ứng được gọi khi các đối tượng rời khỏi phạm vi (nghĩa là khối mà trong đó chúng được khai báo). Các constructor và destructor đối với các đối tượng cục bộ tựđộng được gọi mỗi khi các đối tượng vào và rời khỏi phạm vi.
Các constructor được gọi của các đối tượng cục bộ tĩnh (static) khi sự thực hiện đến điểm mà các đối tượng được khai báo lần đầu tiên. Các destructor tương ứng được gọi khi hàm main() kết thúc hoặc hàm
exit()được gọi.
Ví dụ 3.9: Chương trình sau minh họa thứ tự các constructor và destructor được gọi.
#include <iostream.h> class CreateAndDestroy { public: CreateAndDestroy(int); //Constructor ~CreateAndDestroy(); //Destructor private: int Data; }; CreateAndDestroy::CreateAndDestroy(int Value) { Data = Value;
cout << "Object " << Data << " constructor"; }
CreateAndDestroy::~CreateAndDestroy() {
cout << "Object " << Data << " destructor " << endl; }
void Create(void); //Prototype
CreateAndDestroy First(1); //Doi tuong toan cuc int main()
{
cout << " (global created before main)" << endl; CreateAndDestroy Second(2); //Doi tuong cuc bo cout << " (local automatic in main)" << endl;
static CreateAndDestroy Third(3); //Doi tuong cuc bo cout << " (local static in main)" << endl;
Create(); //Goi ham de tao cac doi tuong
CreateAndDestroy Fourth(4); //Doi tuong cuc bo cout << " (local automatic in main)" << endl;
return 0;
}
//Ham tao cac doi tuong void Create(void)
{
CreateAndDestroy Fifth(5);
cout << " (local automatic in create)" << endl; static CreateAndDestroy Sixth(6);
54
CreateAndDestroy Seventh(7);
cout << " (local automatic in create)" << endl; }
Chương trình khai báo First ở phạm vi toàn cục. Constructor của nó được gọi khi chương trình bắt đầu thực hiện và destructor của nó được gọi lúc chương trình kết thúc sau tất cả các đối tượng khác được hủy bỏ. Hàm main() khai báo ba đối tượng. Các đối tượng Second và Fourth là các đối tượng cục bộ tựđộng và đối tượng Third là một đối tượng cục bộ tĩnh. Các constructor của các đối tượng này được gọi khi chương trình thực hiện đến điểm mà mỗi đối tượng được khai báo. Các destructor của các đối tượng Fourth và Second
được gọi theo thứ tự này khi kết thúc của main() đạt đến. Vì đối tượng Third là tĩnh, nó tồn tại cho đến khi chương trình kết thúc. Destructor của đối tượng Third được gọi trước destructor của First nhưng sau tất cả
các đối tượng khác được hủy bỏ.
Hàm Create() khai báo ba đối tượng – Fifth và Seventh là các đối tượng cục bộ tựđộng và Sixth là một
đối tượng cục bộ tĩnh. Các destructor của các đối tượng Seventh và Fifth được gọi theo thứ tự này khi kết thúc của create() đạt đến. Vì đối tượng Sixth là tĩnh, nó tồn tại cho đến khi chương trình kết thúc. Destructor của đối tượng Sixth được gọi trước các destructor của Third và First nhưng sau tất cả các đối tượng khác
được hủy bỏ.
Chúng ta chạy ví dụ 3.9, kết quảở hình 3.9
Hình 3.9: Kết quả của ví dụ 3.9