Работа с деструкторами...194

We use cookies. Read the Privacy and Cookie Policy

Деструктор имеет то же имя, что и класс, но только с предшествующим ему символом тильды ( ~ ) ( С++ последователен и здесь: ведь символ тильды не что иное, как символ оператора "нет", т.е. деструктор — это отрицание конструктора ).

_________________

194 стр. Часть 3. Введение в классы

 Как и конструктор, деструктор не имеет типа возвращаемого значения. С учётом сказанного деструктор класса Student будет выглядеть так:

    class Student

    {

        public :

            Student( )

            {

                semesterHours = 0 ;

                gpa = 0.0 ;

            }

            ~Student( )

            {

                /* Все используемые ресурсы освобождаются здесь */

            }

            /* ...остальные открытые члены... */

        protected :

            int semesterHours ;

            float gpa ;

    } ;

Деструктор вызывается автоматически, когда объект уничтожается или, если говорить языком С++, происходит его деструкция. Чтобы избежать тавтологии ( "деструктор вызывается для деструкции объекта" ), я по возможности старался не применять этот термин. Можно также сказать "когда объект выходит из области видимости". Локальный объект выходит из области видимости, когда функция, создавшая его, доходит до команды return. Глобальный или статический объект выходит из области видимости, когда прекращается работа программы.

Что касается объектов, создаваемых в куче, то указатель может выйти из области видимости, но память при этом не освобождается. По определению, память не является частью функции. Объект, созданный в куче, уничтожается ( а память возвращается в кучу ) при помощи оператора delete. Всё это продемонстрировано в следующей программе.

    //

    /* DestructMembers — демонстрация использования */

    /*                  конструкторов и деструкторов */

    //

    #include <cstdio>

    #include <cstdlib>

    #include <iostream>

    using namespace std ;

    class Course

    {

        public :

            Course( )    { cout << "Конструктор Course" << endl ; }

            ~Course( ) { cout << "Деструктор Course" << endl ; }

    } ;

    class Student

    {

        public :

            Student( )

            {

                cout << "Конструктор Student" << endl ;

                semesterHours = 0 ;

                gpa = 0.0 ;

_________________

195 стр. Глава 16. Создание и удаление объектов

            }

            ~Student( ) { cout << "Деструктор Student" << endl ; }

        protected :

            int semesterHours ;

            float gpa ;

    } ;

    class Teacher

    {

        public :

            Teacher( )

            {

                cout << "Конструктор Teacher" << endl ;

                pC = new Course ;

            }

            ~Teacher( )

            {

                cout << "Деструктор Teacher" << endl ;

                delete pC ;

            }

        protected :

            Course* pC ;

    } ;

    class TutorPair

    {

        public :

            TutorPair( )

            {

                cout << "Конструктор TutorPair" << endl ;

                noMeetings = 0 ;

            }

            ~TutorPair( ) { cout << "Деструктор TutorPair" << endl ; }

        protected :

            Student student ;

            Teacher teacher ;

            int noMeetings ;

    } ;

    TutorPair* fn( )

    {

        cout << "Создание объекта TutorPair в функции fn( )"

               << endl ;

        TutorPair tp ;

        cout << "Создание объекта TutorPair в куче" << endl ;

        TutorPair* pTP = new TutorPair ;

        cout << "Возврат из функции fn ( )" << endl ;

        return pTP ;

    }

    int main( int nNumberofArgs , char* pszArgs[ ] )

    {

        setlocale ( LC_ALL , ".1251" ) ; /* печать кириллицы */

        /* Вызов функции fn( ) и возврат объекта TutorPair в куче */

        TutorPair* pTPReturned = fn( ) ;

        cout << "Получен объект в куче" << endl ;

        delete pTPReturned ;

        /* Пауза для того, чтобы посмотреть на результат работы программы */

        system( "PAUSE" ) ; return 0 ;

    } 

_________________

196 стр. Часть 3. Введение в классы

Функция main( ) вызывает функцию fn( ), которая создаёт объект tp ( область видимости этого объекта ограничена функцией ), а также объект в куче, возвращаемый функции main( ), которая и уничтожает его, возвращая память в кучу.

При выполнении программы вы увидите на экране следующее.

 

    Создание объекта TutorPair в функции fn( )

    Конструктор Student

    Конструктор Teacher

    Конструктор Course

    Конструктор TutorPair

    Создание объекта TutorPair в куче

    Конструктор Student

    Конструктор Teacher

    Конструктор Course

    Конструктор TutorPair

    Возврат из функции fn( )

    Деструктор TutorPair

    Деструктор Teacher

    Деструктор Course

    Деструктор Student

    Получен объект в куче

    Деструктор TutorPair

    Деструктор Teacher

    Деструктор Course

    Деструктор Student

    Press any key to continue...

Здесь создаются два объекта TutorPair. Первый, tp, является локальным объектом функции fn( ), а второй, рТР, размещается в куче. Первый объект выходит из области видимости при возврате из функции и уничтожается автоматически, а второй остаётся до тех пор, пока функция main( ) не уничтожает его явным образом.

«Последовательность вызовов деструкторов при уничтожении объекта всегда имеет порядок, обратный порядку вызова конструкторов при создании этого объекта.»

[Помни!]

_________________

197 стр. Глава 16. Создание и удаление объектов