ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 «Указатели», а пока использование дест- рукторов не будет иметь для нас большого смысла.

 

13