10222

Конструктор и деструктор

Реферат

Исторические личности и представители мировой культуры

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

Русский

2013-03-24

113 KB

1 чел.

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

  При создании объектов одной из наиболее широко используемых операций, которую выполняется в программах, является инициализация элементов данных объекта. Единственным способом, с помощью которого можно обратиться к частным элементам данных, является использование функций класса. Чтобы упростить процесс инициализации элементов данных класса, C++ использует специальную функцию, называемую конструктором, которая запускается для каждого создаваемого объекта. Функция, запускаемая при уничтожении объекта, называется деструктором.
  Конструктор - функция, которая помогает строить (
конструировать) объект. Деструктор представляет собой функцию, которая помогает уничтожать объект. Деструктор обычно используется, если при уничтожении объекта нужно освободить память, которую занимал объект.

   3.1. Создание простого конструктора.

  Конструктор представляет собой метод класса, который имеет такое же имя, как и класс. Если программа определяет конструктор, C++ будет автоматически вызывать его каждый раз, когда вы создаете объект. Следующая программа создает класс с именем employee, определяет конструктор с именем employee, который присваивает начальные значения объекту. Конструктор не возвращает никакого значения, несмотря на то, что он не объявляется как void. Просто не указываете тип возвращаемого значения:

class employee

   {

   public:

      employee(char *, long, float); //Конструктор

      void show_employee(void);

      int change_salary(float);

      long get_id(void);

   private:

      char name [64];

      long employee_id;

      float salary;

   }; 

В программе конструктор определяется так же, как любой другой метод класса:

   employee::employee(char *name, long employee_id, float salary)

   {

      strcpy(employee::name, name);

      employee::employee_id = employee_id;

      if (salary < 50000.0)

      employee::salary = salary;

      else // Недопустимый оклад

      employee::salary = 0.0;

   } 

  Конструктор не возвращает значение вызвавшей функции. Для него также не используется тип void. Конструктор использует оператор глобального разрешения и имя класса перед именем каждого элемента.

 Primer 1 Лекция 3.

#include <iostream>

#include <string.h>

using namespace std;

  class employee

  {

  public:

     employee(char *, long, float);

     void show_employee(void);

     int change_salary(float);

     long get_id(void);

  private:

     char name [64];

     long employee_id;

     float salary;

  };

  employee::employee(char *name, long employee_id, float salary)

  {

     strcpy(employee::name, name);

     employee::employee_id = employee_id;

     if (salary < 50000.0)

        employee::salary = salary;

     else // Недопустимый оклад

        employee::salary = 0.0;

  }

  void employee::show_employee(void)

  {

     cout << "Служащий: " << name << endl;

     cout << "Номер служащего: " << employee_id << endl;

     cout << "Оклад: " << salary << endl;

  }

  int main()

  {

     system("chcp 1251");

     employee worker("Савин", 101, 10101.0);

     worker.show_employee();

     system("pause");

  }

  За объявлением объекта worker следуют круглые скобки и начальные значения, как и при вызове функции. Когда используется конструктор, ему передают параметры при объявлении объекта:

                     employee worker("Савин", 101, 1000.0); 

  Если потребуется создать несколько объектов employee, можно инициализировать элементы каждого из них с помощью конструктора:

                      employee worker("Савин", 101, 1000.0);

                      employee secretary("Нагель", 57, 20000.0);

                      employee manager("Илюхин", 1022, 30000.0); 

  Конструктор представляет собой специальную функцию, которую C++ автоматически вызывает каждый раз при создании объекта. Назначение конструктора заключается в инициализации элементов данных объекта. Конструктор имеет такое же имя, как и класс.  Конструктор определяется внутри своей программы так же, как и любой метод класса. Единственное различие заключается в том, что конструктор не имеет возвращаемого значения. Когда объявляется объект, можно передавать параметры конструктору:

                      class_name object(valuel, value2, value3);

     3.2. Параметры по умолчанию и перегрузка конструкторов.

  C++ позволяет указывать значения по умолчанию для параметров функции. Если не указывать каких-либо параметров, функция будет использовать значения по умолчанию. Конструктор не является исключением, программа может указать для него значения по умолчанию так же, как и для любой другой функции. Следующий конструктор employee использует по умолчанию значение оклада равным 10000.0, если программа не указывает оклад при создании объекта. Однако программа должна указать имя служащего и его номер:

employee::employee(char *name, long employee_id, float salary = 10000.00)

   {

      strcpy(employee::name, name);

      employee::employee_id = employee_id;

      if (salary < 50000.0)

         employee::salary = salary;

      else // Недопустимый оклад

         employee::salary = 0.0;

   } 

  C++ позволяет программам перегружать определения функций, указывая альтернативные функции для других типов параметров. Также перегружаются конструкторы. Следующая программа перегружает конструктор employee. Первый конструктор требует, чтобы программа указывала имя служащего, номер служащего и оклад. Второй конструктор запрашивает ввести требуемый оклад, если программа не указывает его:

 employee::employee(char *name, long employee_id)

   {

      strcpy(employee::name, name);

      employee::employee_id = employee_id;

      do

       {

         cout << "Введите оклад для " << name << " меньше $50000: ";

         cin >> employee::salary;

       }

      while (salary >= 50000.0);

   } 

  Внутри определения класса программа должна указать прототипы для обоих конструкторов:

class employee

   {

   public:

      employee (char *, long, float);  // Прототипы перегруженных

      employee(char *, long);           //функций

      void show_employee(void);

      int change_salary(float);

      long get_id(void);

   private:

      char name [64];

      long employee_id;

      float salary;

   } 

Реализация программы:

Primer 2 Лекция 3.

#include <iostream>

#include <string.h>

using namespace std;

  class employee

  {

  public:

     employee(char *, long, float);

     employee(char *, long);

     int show_employee();

     int change_salary(float);

     long get_id();

  private:

     char name[64];

     long employee_id;

     float salary;

  };

  employee::employee(char *name, long employee_id, float salary)

  {

     strcpy(employee::name, name);

     employee::employee_id = employee_id;

     if (salary < 50000.0) employee::salary = salary;

     else // Недопустимый оклад

        employee::salary = 0.0;

  }

  employee::employee(char *name, long employee_id)

  {

     strcpy(employee::name, name);

     employee::employee_id = employee_id;

     do

     {

      cout << "Введите оклад для " << name << " меньше $50000: ";

      cin >> employee::salary;

     }

     while (salary >= 50000.0);

  }

  int employee::show_employee()

  {

     cout << "Служащий: " << name << endl;

     cout << "Номер служащего: " << employee_id << endl;

     cout << "Оклад: " << salary << endl;

  }

  int main()

  {

     system("chcp 1251");

     employee worker("Савин", 101, 1000);

     employee manager("Нагеь", 102);

     worker.show_employee();

     manager.show_employee();

     system("pause");

  }

    3.3. Представление о деструкторе.

  Деструктор автоматически запускается каждый раз, когда программа уничтожает объект. Каждая из созданных до сих пор программ создавала объекты в самом начале своего выполнения, просто объявляя их. При завершении программ C++ уничтожал объекты. Если определить деструктор внутри программы, C++ будет автоматически вызывать деструктор для каждого объекта, когда программа завершается (т.е. когда объекты уничтожаются). Подобно конструктору, деструктор имеет такое же имя, как и класс объекта. В случае деструктора его имя предваряется символом тильды (~):

~class_name (void)   //указывает деструктор

   {

   // Операторы деструктора

   } 

  В отличие от конструктора нельзя передавать параметры деструктору. Следующая программа определяет деструктор для класса employee:

void employee:: ~employee(void)

   {

      cout << "Уничтожение объекта для " << name << endl;

   }

  Деструктор выводит на ваш экран сообщение о том, что C++ уничтожает объект. Когда программа завершается, C++ автоматически вызывает деструктор для каждого объекта. Реализация программы:

   Primer 3 Лекция 3.

#include <iostream>

#include <string.h>

using namespace std;

  class employee

  {

  public:

     employee(char *, long, float);

     ~employee();

     int show_employee();

     int change_salary(float);

     long get_id(void);

  private:

     char name [64];

     long employee_id;

     float salary;

  };

  employee::employee(char *name, long employee_id, float salary)

  {

     strcpy(employee::name, name);

     employee::employee_id = employee_id;

     if (salary < 50000.0) employee::salary = salary;

     else // Недопустимый оклад

     employee::salary = 0.0;

  }

  int employee::show_employee()

  {

     cout << "Служащий: " << name << endl;

     cout << "Номер служащего: " << employee_id << endl;

     cout << "Оклад: " << salary << endl;

  }

   employee::~employee()

  {

     cout << "Уничтожение объекта для " << name << endl;

  }

  int main()

  {

     system("chcp 1251");

     employee worker("Савин", 101, 10000.0);

     worker.show_employee();

     worker.~employee();

     system("pause");

  }

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


 

А также другие работы, которые могут Вас заинтересовать

33965. Желтуха 35 KB
  Уровень билирубина в крови при этом повышен. В зависимости от причины повышения уровня билирубина в крови выделяют три основных типа желтух. Паренхиматозная печеночная желтуха развивается в результате повреждения гепатоцитов способность которых связывать свободный 'билирубин крови и переводить его в билирубин глюкуронид прямой билирубин уменьшается. В анализах крови повышение уровня непрямого билирубина концентрация прямого билибурина не повышена.
33966. Показания к операции. Характер оперативного вмешательства и последствия при остром панкреатите 26.5 KB
  Хирургическое лечение при остром панкреатите показано: 1 при сочетании острого панкреатита с деструктивными формами острого холецистита; 2 при безуспешном консервативном лечении в течение 36 48 ч; 3 при панкреатогенном перитоните при невозможности выполнения лапароскопического дренирования брюшной полости; 4 при осложнениях острого панкреатита: абсцессе сальниковой сумки флегмоне забрюшинной клетчатки. В диагностике и лечении деструктивных форм острого панкреатита большое значение имеет лапароскопия при которой можно уточнить...
33967. Анатомия и физиология пищевода. Методы исследования. Дивертикул пищевода 41.5 KB
  Анатомия и физиология пищевода. Дивертикул пищевода. Вход в пищевод расположен на уровне перстневидного хряща и отстоит от переднего края верхних резцов на 14 16 см рот пищевода. Второе физиологическое сужение пищевода находится примерно в 25 см от края верхних резцов на уровне бифуркации трахеи и пересечения пищевода .
33968. Пенетрация язвы 25 KB
  Пенетрация язвы В развитии пенетрации язвы различают три стадии: внутристеночную пенетрацию язвы стадию фиброзного сращения завершенную пенетрацию в соседний орган. Наиболее часто пенетрация язвы происходит в малый сальник в головку поджелудочной железы в печеночнодвенадцатиперстную связку. Возможна пенетрация язвы в печень в желчный пузырь в поперечную ободочную кишку и ее брыжейку. Появление боли в спине боль опоясывающего характера наблюдаются при пенетрации язвы в поджелудочную железу.
33969. Дудоденальная непроходимость. Пилородуодунальній стеноз 23.5 KB
  или пилорического отдела желудка. воспалительным инфильтратом обтурацией просвета отеком слизистой пилороспазмом или опухолью желудка. Декомпенсация гастростаз атония желудка многократная рвота рвотные массы зловонные многодневной давности. Пальпаторно контуры растянутого желудка шум плеска .
33970. Полипы желудка 25.5 KB
  Полипы желудка. Полипы желудка представляют собой патологические разрастания эпителиальной ткани. 7090 всех полипов желудка cоставляют гиперпластические полипы. Остальные 1030 приходится на долю аденоматозных полипов железистых полипов дна желудка и гамартомных полипов.
33971. Брюшина. Перитонит: классификация по клин. течению, распространнённостью процеса, характером выпота 37 KB
  Брюшина представляет собой тонкую серозную оболочку покрывающую внутреннюю поверхность брюшной стенки и расположенные в брюшной полости внутренние органы. Выделяют париетальную брюшину покрывающую внутреннюю поверхность брюшной стенки и висцеральную покрывающую большую часть внутренних органов. В брюшной полости в нормальных условиях находится небольшое количество прозрачной жидкости увлажняющей поверхность внутренних органов и облегчающей перистальтику желудка и кишечника. Богатая васкуляризация брюшинного листка обусловливает его...
33972. НЕПРОХОДИМОСТЬ КИШЕЧНАЯ 29.5 KB
  Классификация По этиологии Динамическая Спастическая заболевания нервной системы истерия спазмофилия дискинезия глистная инвазия полипы толстой кишки Паралитическая воспалительный процесс в брюшной полости флегмона гематома забрюшинного пространства состояние после лапаротомии рефлекторные влияния патологических состояний внебрюшинной локализации например пневмонии плеврита ИМ тромбоз брыжеечных сосудов инфекционные заболевания токсические парезы Механическая Обтурационная: интраорганная глистная инвазия...
33973. Тактика хирурга при лечении кишечной непроходимости. Особенности 35.5 KB
  Тактика хирурга при лечении кишечной непроходимости. Перед началом лечения необходимо четко представлять с каким видом непроходимости приходится иметь дело. При странгуляционной непроходимости или обоснованном подозрении на нее показана экстренная операция ибо задержка хирургического вмешательства может привести к некрозу кишки и разлитому перитониту. При обтурационной кишечной непроходимости можно попытаться использовать консервативное лечение с целью ликвидации кишечной непроходимости с последующим устранением вызвавшей .