Работа с деструкторами...194
Деструктор имеет то же имя, что и класс, но только с предшествующим ему символом тильды ( ~ ) ( С++ последователен и здесь: ведь символ тильды не что иное, как символ оператора "нет", т.е. деструктор — это отрицание конструктора ).
_________________
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. Создание и удаление объектов
Больше книг — больше знаний!
Заберите 20% скидку на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ