Функция-член класса Х с именем ~Х называется деструктором. Она используется для разрушения значения класса Х непосредственно перед разрушением содержащего его объекта. Деструктор не имеет параметров и возвращаемого типа, нельзя задавать даже
Деструкторы автоматически вызываются, когда
- автоматический или временный объект уходит из области действия;
- завершается программа (для статически сконструированных объектов);
- используется операция delete для объектов размещенных операцией new.
Деструктор может также вызываться явным образом.
class X { private: int n; public: X(); ~X(); }; | |
X xx; | |
xx.~X(); | // Явный вызов деструктора |
Преобразования
Преобразования (изменения типа) объектов класса выполняются конструкторами и преобразующими функциями.
Такие преобразования, называемые пользовательскими, часто неявно применяются в дополнение к стандартным преобразованиям. Например, функция, ожидающая параметр типа Х, может вызываться не только с параметром типа Х, но и с параметром типа Т, если существует преобразование из Т в Х. Кроме того, пользовательские преобразования применяются для приведения, параметров функций, возвращаемых функциями значений, операндов в выражениях, управляющих выражений, операторах цикла и и для явного приведения типов.
|
|
Пользовательские преобразования применяются только там, где они однозначны.
Преобразование посредством конструктора
Конструктор с одним параметром задаёт преобразование типа своего параметра к типу своего класса.
Конструктор с одним параметром не обязательно вызывается явно.
class X { private: int x; public: X(int n); ... }; X::X(int n) { x = n; } | |
X a = 1; | // Эквивалентно X a = X(1) |
Однако неявное преобразование может быть нежелательно в некоторых случаях.
class Str { private: char *str; public: Str(int n) { str = new char [n]; *str = 0; } Str(const char *p) { str = new char [strlen(p) + 1]; strcpy(str, p); } ~Str() { if (str) delete [] str; } }; | |
Str s = 'a'; | // Создание строки из int ('a') элементов |
Неявное преобразование можно подавить, объявив конструктор с модификатором explicit. Такой конструктор будет вызваться только явно.
class Str { private: char *str; public: explicit Str(int n) { str = new char [n]; *str = 0; } Str(const char *p) { str = new char [strlen(p) + 1]; strcpy(str, p); } ~Str() { if (str) delete [] str; } }; | |
Str s1 = 'a'; Str s2(10); | // Ошибка – нет неявного преобразования char в Str // Правильно – создаётся строка из 10 символов |