ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 6) онлайн
Графический пример
Давайте модифицируем пример CIRCLES так, чтобы вместо функции set() исполь- зовался конструктор. Чтобы инициализировать пять полей класса, конструктору необходимо указать пять имен и пять соответствующих им значений в списке инициализации. Приведем листинг программы CIRCTOR:
// circtor.cpp
// графические объекты "круг" и конструкторы
#include "msoftcon.h " // для функций консольной графики
//////////////////////////////////////////////////////////
class circle // графический объект "круг"
{
protected:
int xCo,yCo; // координаты центра
int radius;
color fillcolor; // цвет
fstyle fillstyle; // стиль заполнения
public:
// конструктор
circle( int x, int y, int r, color fc, fstyle fs ):
xCo(x), yCo(y), radius(r), fillcolor(fc), fillstyle(fs)
{ }
void draw() // рисование круга
{
set_color(fillcolor); // установка цвета и
set_fill_style(fillstyle); // стиля заполнения
draw_circle(xCo,yCo,radius);// вывод круга на экран
}
};
//////////////////////////////////////////////////////////
int main()
{
init_graphics(); // инициализация графики
// создание кругов
circle c1(15, 7, 5, cBLUE, X_FILL);
circle c2(41, 12, 7, cRED, O_FILL);
circle c3(65, 18, 4, cGREEN, MEDIUM_FILL);
c1.draw(); // рисование кругов
c2.draw();
c3.draw();
set_cursor_pos(1,25); // левый нижний угол
return 0;
}
Данная программа схожа с программой CIRCLES, за исключением того, что функция set() замещена конструктором. Обратите внимание, как это изменение упростило функцию main(). Вместо двух операторов, используемых для созда- ния объекта и для его инициализации, используется один оператор, совмеща- ющий эти два действия.
Деструкторы
Как мы уже видели, особый метод класса — конструктор — вызывается при соз- дании объекта. Как вы, возможно, догадались, существует другая функция, авто- матически вызываемая при уничтожении объекта и называемая деструктором. Деструктор имеет имя, совпадающее с именем конструктора (а следовательно, и класса) и предваряющееся символом ~
class Foo {
private:
int data; public:
Foo() : data(0) //конструктор (имя такое же, как у класса)
{ }
~Foo() //деструктор (то же имя, но с символом ~)
{ }
};
Подобно конструкторам, деструкторы не возвращают значения и не имеют аргументов, поскольку невозможно уничтожение объектов несколькими спосо- бами. Наиболее распространенное применение деструкторов — освобождение памяти, выделенной конструктором при создании объекта. Более подробно мы рассмотрим эти действия в главе 10 «Указатели», а пока использование дест- рукторов не будет иметь для нас большого смысла.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
