Глава 10. Объектно-ориентированное программирование
{
double x , y , z ;
public :
double get_x ( ) ;
void set_x ( double x ) ;
. . . .
double s p a t i a l _ v e c t o r : : get_x ( ) { return x ; }
. . . .
}
Этот способ является неудобным, т. к. при большом количестве переменных
требует множества тривиальных описаний. Его следует применять только для
тех свойств класса, внешний доступ к которым действительно необходим.
Однако есть особая ситуация, когда требуется за один раз присвоить значе-
ния переменным-членам класса (всем или большинству): это момент создания
объекта, т. е. переменной-экземпляра класса.
C++
позволяет создать специальный метод, который будет автоматически вы-
зываться для инициализации переменных-членов объекта при его создании. Та-
кой метод называется конструктором. Программист, написавший класс, может
по своему усмотрению включить в конструктор код для присваивания элементам
начальных значений, динамического выделения памяти и т. д. Если программист
не определил конструктор класса, компилятор самостоятельно сгенерирует кон-
структор по умолчанию (пустой и без входных параметров).
Конструктор может вызываться явно или неявно. Компилятор сам вызывает
конструктор в том месте программы, где создаётся объект класса.
У описания конструкторов в C++ есть следующие особенности:
• имя конструктора в C++ совпадает с именем класса;
• конструктор не возвращает никакое значение, но при описании конструк-
тора не используется и ключевое слово void.
Поскольку конструктор удобно использовать для динамического выделения па-
мяти, должен быть также и способ освобождать эту память при уничтожении
объекта (напомним, что локальные объекты удаляются тогда, когда они выходят
из области видимости, а глобальные объекты удаляются при завершении про-
граммы). Действительно, функцией, обратной конструктору, является деструк-
тор
. Эта функция вызывается при удалении объекта.
В C++ деструкторы имеют имена, состоящие из имени класса с префиксом-
тильдой: «˜имя_класса». Как и конструктор, деструктор не возвращает никакое
значение, но в отличие от конструктора он не может быть вызван явно. Причины
такого ограничения очевидны: код, предположительно освобождающий динами-
ческую память, будет обязательно вызван при выходе из области видимости. Его
явный вызов привёл бы к тому, что память уже освободилась заранее, а при уни-
чтожении объекта программа попыталась бы сделать это снова и сгенерировала
бы ошибку.
Конструктор не может быть описан в закрытой части класса. В общем слу-
чае то же ограничение накладывают и на деструктор. В следующем примере
мы создаём объект, вызываем его метод, а затем разрушаем при завершении
программы:
Программирование на языке С++ в среде Qt Creator
10.2. Классы и объекты в C++
275
#include
#include
276
Do'stlaringiz bilan baham: |