Инструменты пользователя

Инструменты сайта


konstruktory_i_destruktory

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

konstruktory_i_destruktory [2019/01/07 20:14]
konstruktory_i_destruktory [2020/06/13 13:46] (текущий)
Строка 1: Строка 1:
 +====== Конструкторы и деструкторы С++ ======
 +====== Конструкторы ======
 +Начальная инициализация объектов класса. Иногда во время создания объекта его элементам необходимо присвоить начальные значения. Как вы уже знаете, сделать это непосредственно в определении класса нельзя. Решить данную проблему можно, написав функцию, которая будет присваивать начальные значения переменным класса, и вызывать эту функцию каждый раз сразу после объявления объекта, что мы благополучно сделали в примере предыдущего раздела урока.
  
 +Однако, в языке С++ есть механизм, позволяющий решить эту проблему иным путём. Это - конструкторы.
 +
 +**Конструктор** (construct - создавать) - это специальная функция-член класса,объявленная с таким же именем, как и класс.<note important> Для конструктора не определяется тип возвращаемого значения. ДАЖЕ void!!!</note> Рассмотрим пример создания конструктора: 
 +
 +<file>
 +# include <iostream>
 +using namespace std;
 +class Test{
 + // так как спецификатор доступа не указан
 + // данная переменная будет по умолчанию закрыта
 + // для доступа вне класса (private)
 + int one;
 +
 + // спецификатор доступа public
 + // все члены, идущие после него
 + // будут открыты для доступа извне
 +public:
 + Test(){
 + one=0;
 + two=0;
 +
 +
 + // инициализировать переменные в классе 
 + // при создании запрещено, поэтому мы определяем
 + // метод, реализующий данное действие
 + void Initial(int o,int t){
 + one=o;
 + two=t;
 + }
 +
 + // метод показывающий переменные класса 
 + // на экран
 + void Show(){
 + cout<<"\n\n"<<one<<"\t"<<two<<"\n\n";
 + }
 + int two;
 +};
 +void main(){
 +
 + // создается объект с типом Test
 + Test obj; //(здесь, в момент создания объекта, сработает конструктор)
 +
 + // показ на экран
 + obj.Show(); // 0 0
 +
 + // вызывается функция, инициализирующая его свойства
 + obj.Initial(2,5);
 +
 + // показ на экран
 + obj.Show(); // 2 5
 +
 + // прямая запись в открытую переменную two
 + // с переменной one такая запись невозможна, так
 + // как доступ к ней закрыт
 + obj.two=45;
 +
 + // снова показ на экран
 + obj.Show(); // 2 45
 +
 +}
 +</file>
 +  - Конструктор автоматически вызывается при создании объекта, т.е не нужно специально его вызывать.
 +  - Основное назначение конструкторов - инициализация объектов.
 +  - Конструктор всегда должен иметь спецификатор доступа public!!!
 +
 +C помощью параметров конструктору можно передать любые данные, необходимые для инициализации объектов класса.
 +
 +**Пример.** Класс, описывающий точку.
 +<file>
 +# include <iostream>
 +using namespace std;
 +
 +// описание класса Point
 +class Point {
 + int x, y; 
 + // координаты точки, по умолчанию имеют 
 + // уровень доступа private
 +
 +public:
 + // конструктор присваивает переменным класса  x и y начальные 
 + // значения соответственно x0 и y0
 + Point(int x0, int y0)
 + {
 +    x = x0;
 +    y = y0;
 + }
 +
 +
 + // функция вывода координат точки на экран
 + void ShowPoint()
 + {
 +    cout << "\nx = " << x;
 +    cout << "\ny = " << y;
 + }
 +
 +};
 +
 +void main()
 +{
 + Point A(1,3); // создаем точку А (объект типа Point) 
 + // с координатами x = 1, y = 3 (вызывается конструктор Point(1, 3)
 + A.ShowPoint(); // выводим координаты точки А на экран
 +
 +}
 +</file>
 +
 +<note>При создании объекта значения параметров передаются конструктору с использованием синтаксиса, подобного обычному вызову функции.</note>
 +Еще кое-что о конструкторах...
 +  * Конструктор без параметров называют конструктором по умолчанию. Такой конструктор обычно присваивает переменным-членам класса наиболее часто используемые значения.
 +<file>
 + Point()
 + {
 +    x = 0;
 +    y = 0;
 + }
 +</file>
 +  * Для каждого класса может существовать только один конструктор по умолчанию.
 +  * Если для класса не определено никакого конструктора, компилятор создает конструктор по умолчанию. Такой конструктор не задает никаких начальных значений, он просто существует :))).
 +
 +====== Деструкторы ======
 +**Деструктор** (destruct - разрушать) выполняет функцию, противоположную функции конструктора.<note>Имя деструктора должно совпадать с именем конструктора, но перед ним ставится знак ~ (тильда).</note>
 +Деструктор - это специальная функция класса, которая автоматически вызывается при уничтожении объекта - например, когда объект выходит из области видимости. Деструктор может выполнять любые задачи, в момент удаления объекта. Например, если в конструкторе была динамически выделена память, то деструктор должен освободить эту память перед удалением объкта класса.
 +
 +
 +Основные особенности при работе с деструктором.
 +  - Деструктор не принимает никаких параметров и не возвращает никаких значений.
 +  - Класс может иметь только один деструктор.
 +Пример последовательности, в которой вызываются конструкторы и деструкторы.
 +<file>
 +# include <iostream>
 +using namespace std;
 +
 +// описание класса CreateAndDestroy
 +class CreateAndDestroy
 +{
 +public: 
 + CreateAndDestroy(int value)  // конструктор 
 + {
 +   data = value;
 +   cout << " Object " << data << " constructor\n";
 + }
 +
 + ~CreateAndDestroy()    // деструктор
 + {
 + cout << " Object " << data << " destructor\n";
 + }
 +private:
 + int data;
 +};
 +
 +void main ()
 +{
 +
 + CreateAndDestroy one(1); 
 + CreateAndDestroy two(2);  
 +
 +}
 +</file>
 +
 +РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ
 +
 +Object 1 constructor    
 +Object 2 constructor    
 +Object 2 destructor     
 +Object 1 destructor  
 +
 + 
 +
 +Вывод к примеру - деструкторы вызываются в последовательности, обратной вызову конструкторов.