Деструкторы

Функция-член класса Х с именем ~Х называется деструктором. Она используется для разрушения значения класса Х непосредственно перед разрушением содержащего его объекта. Деструктор не имеет параметров и возвращаемого типа, нельзя задавать даже

Деструкторы автоматически вызываются, когда

  • автоматический или временный объект уходит из области действия;
  • завершается программа (для статически сконструированных объектов);
  • используется операция 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 символов

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: