Конструкторы и деструкторы С++

Конструкторы

Начальная инициализация объектов класса. Иногда во время создания объекта его элементам необходимо присвоить начальные значения. Как вы уже знаете, сделать это непосредственно в определении класса нельзя. Решить данную проблему можно, написав функцию, которая будет присваивать начальные значения переменным класса, и вызывать эту функцию каждый раз сразу после объявления объекта, что мы благополучно сделали в примере предыдущего раздела урока.

Однако, в языке С++ есть механизм, позволяющий решить эту проблему иным путём. Это - конструкторы.

Конструктор (construct - создавать) - это специальная функция-член класса,объявленная с таким же именем, как и класс.

Для конструктора не определяется тип возвращаемого значения. ДАЖЕ void!!!

Рассмотрим пример создания конструктора:

# 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

}
  1. Конструктор автоматически вызывается при создании объекта, т.е не нужно специально его вызывать.
  2. Основное назначение конструкторов - инициализация объектов.
  3. Конструктор всегда должен иметь спецификатор доступа public!!!

C помощью параметров конструктору можно передать любые данные, необходимые для инициализации объектов класса.

Пример. Класс, описывающий точку.

# 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(); // выводим координаты точки А на экран
	
}
При создании объекта значения параметров передаются конструктору с использованием синтаксиса, подобного обычному вызову функции.

Еще кое-что о конструкторах…

  • Конструктор без параметров называют конструктором по умолчанию. Такой конструктор обычно присваивает переменным-членам класса наиболее часто используемые значения.
	Point()
	{
	   x = 0;
	   y = 0;
	}
  • Для каждого класса может существовать только один конструктор по умолчанию.
  • Если для класса не определено никакого конструктора, компилятор создает конструктор по умолчанию. Такой конструктор не задает никаких начальных значений, он просто существует :))).

Деструкторы

Деструктор (destruct - разрушать) выполняет функцию, противоположную функции конструктора.

Имя деструктора должно совпадать с именем конструктора, но перед ним ставится знак ~ (тильда).

Деструктор - это специальная функция класса, которая автоматически вызывается при уничтожении объекта - например, когда объект выходит из области видимости. Деструктор может выполнять любые задачи, в момент удаления объекта. Например, если в конструкторе была динамически выделена память, то деструктор должен освободить эту память перед удалением объкта класса.

Основные особенности при работе с деструктором.

  1. Деструктор не принимает никаких параметров и не возвращает никаких значений.
  2. Класс может иметь только один деструктор.

Пример последовательности, в которой вызываются конструкторы и деструкторы.

# 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);  
	
}

РЕЗУЛЬТАТ РАБОТЫ ПРОГРАММЫ

Object 1 constructor Object 2 constructor Object 2 destructor Object 1 destructor

Вывод к примеру - деструкторы вызываются в последовательности, обратной вызову конструкторов.

PQ VPS сервера в 28+ странах.