- •Int z[n]; //Неверно!
- •Урок 10. Рекурсивные функции
- •Int z[3]; //Массив
- •Урок 26. Конструкторы и деструкторы
- •Урок 27. Классы и указатели
- •Урок 28. Практика: список - добавление элементов
- •Урок 29. Показ элементов списка
- •Урок 30. Ищем элемент в списке
- •Урок 31. Пара вспомогательных методов для списка
- •Урок 32. Удаление элемента из списка
- •Урок 33. Функция с переменным числом параметров
- •Урок 34. Считаем элементы в списке
- •Урок 35. Обмен соседних элементов в списке
- •Урок 36. Получаем элемент списка по его номеру
- •Урок 36. Получаем элемент списка по его номеру
- •Урок 37. Сортируем элементы списка
- •Урок 38. Сортировка с перегрузкой оператора
Урок 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++
