Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебник с,с++.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
68.29 Кб
Скачать

Урок 26. Конструкторы и деструкторы

Конструкторы и деструкторы - это специальные методы класса. Это надо понять в первую очередь. Разумеется, эти методы обладают целым рядом особенностей (именно по этому они и выделены в специальную группу). Сейчас мы об этих особенностях и поговорим.

Первое. В отличие от других методов они должны называться особым образом. Если обычные методы могут называться как угодно, то имя констуктора должно совпадать с именем класса, а имя деструктора - с именем класса с приписанной в начале тильдой. Например, если класс называется CRect, то конструктор этого класса обязан называться тоже CRect, а деструктор - ~CRect.

Второе. В отличии от других методов конструктор и деструктор вызываются сами (а другие методы мы вызываем явным образом). Конструктор вызывается в момент создания экземпляра класса, а деструктор - в момент уничтожения. Т. е. их не надо вызывать явным образом - они вызываются сами. Именно поэтому конструкторы обычно используются для задания некоторых начальных значений для переменных класса, а деструкторы - для освобождения памяти (в случае если у вас есть внутри класса переменные-указатели).

Третье. Ни конструктор, ни деструктор не возвращают никакого значения (даже типа void). Это означает, в частности, что при обяъвлении конструтора и деструктора в классе мы перед ними не пишем ни какой тип.

Четвертое. В классе может быть несколько конструкторов (и они должны различаться параметрами), и только один деструктор (у него параметров вообще быть не может).

Вот пример на все вышесказанное (этот пример основан на уроке 24):

class CRect

{

float m_a, m_b; //Стороны.

public:

//Конструкторы и деструктор.

CRect(); // Конструктор без параметров.

CRect(float a. float b); // Конструктор с двумя параметрами.

~CRect(); // Деструктор.

...

};

...

// Реализация конструкторов и деструкторов.

CRect::CRect()

{

// Задание стандартных (нулевых) значений.

m_a = 0;

m_b = 0;

}

CRect::CRect(float a. float b)

{

// Задание значений, задаваемых параметрами.

m_a = a;

m_b = b;

}

CRect::~CRect()

{

// Просто вывод некоторой надписи.

cout<<"Destructor\n";

}

А вот так можно использовать класс в функции main:

void main()

{

//Использование класса.

CRect r; // Вызов конструктора без параметров.

cout<<"Perimeter = "<<r.GetPerim()<<"\n"; // Выведется 0.

cout<<"Square = "<<r.GetSquare()<<"\n"; // Выведется 0.

CRect r1(2, 3); // Вызов конструктора с параметрами.

cout<<"Perimeter = "<<r1.GetPerim()<<"\n"; // Выведется 10.

cout<<"Square = "<<r1.GetSquare()<<"\n"; // Выведется 6.

// В этом месте вызовутся 2 деструктора - для переменных r и r1.

// Соответственно, на консоль выведется два раза слово "Destructor".

}

C/C++

Урок 27. Классы и указатели

На прошлых уроках мы видели только один способ объявления экземпляров класса - а именно мы писали что-то вроде:

CMyClass z;

Вообще же говоря экземпляры класса лучше во многих случаях заводить не в стеке, а в куче (at heap - подробности см. в уроке 15. Это, в частности, связано с тем, что стек - вещь довольно-таки ограниченная по объему, классы же часто представляют из себя довольно-таки большие и сложные объекты, и если вы будете размещать в стеке что-то вроже массива экземпляров класса, то объема стека просто может не хватить (хотя, конечно, для учебных программм это случится навряд ли).

Так же как и для встроенных типов данных для размещения экземпляра класса в куче использется оператор new. Именно он и занимается выделением памяти. Вот пример:

CMyClass * z;

z = new CMyClass; // Непосредственное выделение памяти.

Конструктор класса при этом вызовется на второй строке, т. е. в операторе new.

Эти два оператора можно объединить:

CMyClass * z = new CMyClass; // Непосредственное выделение памяти.

Если в классе есть конструктор с параметрами, то он вызывается примерно так:

// Вызов конструтора с одним параметром.

CMyClass * z = new CMyClass(22);

// Вызов конструтора с двумя параметрами.

CMyClass * z = new CMyClass(22, 44);

Еще одно отличие между двумя способами создания экземпляра класса (в стеке или в куче) - это вызов методов класса. Если при создании экземпляра в стеке между именем экземпляра и именем метода используется точка, то при создании экземпляра класса в куче (т. е. через оператор new) используется стрелочка. Вот пример:

CMyClass * z = new CMyClass;

z->SomeMethod();

C/C++