2.2.Конструкторы и деструкторы производных классов

Лекция



Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game

Привет, сегодня поговорим про конструкторы, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое конструкторы, деструкторы производных классов , настоятельно рекомендую прочитать все из категории С++ (C plus plus).

Поскольку конструкторы не наследуются, при создании производного класса наследуемые им данные-члены должны инициализироваться конструктором базового класса. Конструктор базового класса вызывается автоматически и выполняется до конструктора производного класса. Если наследуется несколько базовых классов, то их конструкторы выполняются в той последовательности, в которой перечислены базовые классы в определении производного класса. Конструктор производного класса вызывается по окончании работы конструкторов базовых классов. Параметры конструктора базового класса указываются в определении конструктора  производного класса. Таким образом происходит передача аргументов от конструктора производного класса конструктору базового класса.

Например.

class Basis

{ int a,b;

public:

Basis(int x,int y){a=x;b=y;}

};

class Inherit:public Basis

{int sum;

public:

Inherit(int x,int y, int s):Basis(x,y){sum=s;}

};

     Запомните, что конструктор базового класса вызывается автоматически и мы указываем его в определении конструктора производного класса только для передачи ему аргументов.

     Объекты класса конструируются снизу вверх: сначала базовый, потом компоненты-объекты (если они имеются), а потом сам  производный класс. Т.о. объект производного класса содержит в качестве подобъекта объект базового класса.Уничтожаются объекты в обратном порядке: сначала производный, потом его  компоненты-объекты, а потом базовый объект.Как мы знаем, объект уничтожается при завершении программы или при выходе из области действия определения объектов и эти действия выполняет деструктор. Статус деструктора по умолчанию public. Деструкторы не наследуется, поэтому даже при отсутствии в производном классе деструктора, он не передается из базового, а  формируется компилятором как умалчиваемый. Классы, входящие в иерархию, должны иметь в своем распоряжении виртуальные деструкторы. Деструкторы могут переопределяться, но не перегружаться. В любом классе могут быть в качестве компонентов определены другие классы.. В этих классах могут быть свои деструкторы, которые при уничтожении объекта охватывающего (внешнего) класса  выполняются после деструктора охватывающего класса.  Деструкторы базовых классов выполняются в порядке, обратном перечислению классов в определении  производного класса. Об этом говорит сайт https://intellect.icu . Таким образом, порядок уничтожения объекта противоположен по отношению к порядку его конструирования.

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
Пример 2.2.1

 

Пример 2.2.1

 

 // Определение класса базового класса ТОЧКА и производного класса ПЯТНО.

 

#include <graphics.h> // используем графику

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
 

#include <conio.h>

 

class point // Определение класса ТОЧКА

 

{

 

  protected:

 

  int x,y;

 

  public:

 

  point(int x1=0,int y1=0);

 

  int& getx(void);

 

  int& gety(void);

 

  void show(void);

 

  void move(int x1=0,int y1=0);

 

 private:

 

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
 void hide();

 

};

 

class spot : public point  // Определение класса ПЯТНО

 

{protected:

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
 

    int r;  // радиус

 

    int vis;  // признак видимости

 

    int tag;  // признак сохранения видимого образа объекта в памяти

 

   spot *pspot; // указатель на область памяти для видимого образа

 

 public:

 

    spot(int ,int ,int );

 

    void show();

 

    void hide();

 

    void move(int ,int );

 

    void change (float d)  // изменить размер

 

  }; 

 

// Определение функций - членов класса ТОЧКА

 

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
point : : point(int x1,int y1){x = x1; y = y1;}

 

int& point : : getx(void){return x;}

 

int& point : : gety(void){return y;}

 

void point : : show(void){putpixel(x, y, getcolor());}

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
 

void point : : hide(void){putpixel(x,y,getbkcolor());}

 

void point : : move(int x1,int y1)

 

{

 

  hide();

 

  x = x1; y = y1;

 

  show();

 

}

 

// Определение функций - членов класса ПЯТНО

 

spot::spot(int x1,int y1,int r1) : point(x1,y1)

 

{int size;

 

 vis = 0; tag = 0; r = r1;

 

size = imagesize(x1–r,y1–r,x1+r,y1+r);

 

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
pspot = (spot*)new char[size];}

 

spor::~spot(){hide(); tag = 0; delete pspot;}

 

void show()

 

{if(tag = = 0)

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
 

{circle(x,y,r);

 

  floodfill(x,y,getcolor());

 

  getimage(x–r,y–r,x+r,y+r,pspot);

 

 tag = 1; }

 

else putimage(x–r,y–r,pspot,XOR_PUT);

 

vis = 1;}

 

void spot::hide()

 

{if(vis = = 0) return;

 

putimage(x–r,y–r,pspot,XOR_PUT);

 

vis = 0;}

 

void spot::move(int x1,int y1)

 

{hide();

 

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
 x = x1; y = y1;

 

 show();}

 

 void spot::change(float d)

 

{float a; int size; hide(); tag = 0;

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
 

 delete pspot;

 

 a = d*r;

 

 if(a<=0)  r = 0;

 

 else r = (int)a;

 

 size = imagesize(x–r,y–r,x+r,y+r);

 

 pspot = (spot*)new char[size];

 

 show();}

 

 int& spot::getr(void){return r;}

 

};

 

// Создаются  два объекта, показываются, затем один перемещается, а другой

 

// изменяет размеры 

 

void main()

 

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
{

 

//инициализация графики 

 

int dr=DETECT,mod;

 

initgraph(&dr,&mod,“C : \ tc \ bgi”);

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
 

{

 

 spot A(200,50,20);

 

 spot B(500,200,30);

 

 A.show(); getch();

 

 B.show(); getch();

 

 A.move(50,60); getch();

 

 B.change(3); getch();

 

}

 

closegraph();

 

}

 

 

 

 

      В этом примере  в объекте spot точка создается как безымянный объект класса point. Особенностью функции main в примере является наличие внутреннего блока для работы с объектами spot. Это связано с наличием в классе spot деструктора, при выполнении которого вызывается метод hide(), требующий графического режима. Если построить программу без внутреннего блока, то деструктор будет вызываться при окончании программы, когда графический режим закрыт.Эту проблему можно также решить путем явного вызова деструктора, например

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game

В.change(3); getch();

А.spot : : ~spot();

getch();

B.spot : : ~spot();

Electron in the transistor-resistor kingdom

Game: Perform tasks and rest cool.8 people play!

Play game
closegraph();

В общем, мой друг ты одолел чтение этой статьи об конструкторы. Работы впереди у тебя будет много. Смело пиши комментарии, развивайся и счастье окажется в твоих руках. Надеюсь, что теперь ты понял что такое конструкторы, деструкторы производных классов и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории С++ (C plus plus)

Из статьи мы узнали кратко, но содержательно про конструкторы
создано: 2015-12-20
обновлено: 2021-03-13
144



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

С++ (C plus plus)

Термины: С++ (C plus plus)