89790

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

Лекция

Информатика, кибернетика и программирование

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

Русский

2015-05-13

85.41 KB

2 чел.

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

Содержание

  1.  Конструктор
  •   в struct
  •   в class
  •   конструктор по умолчанию
  •   копирующий конструктор
  1.  Деструктор

Конструктор

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

имя_класса ( список_формальных _параметров) { операторы_тела _конструктора }

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

Вызов конструктора:

имя_класса имя_объекта (не_пустой_список_фактических_параметров_конструктора);

имя_класса  * имя_указателя_на_объект_класса = new имя_класса (фактические_параметры_конструктора);

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

Рассмотрим конструкторы на примере класса goods:

class goods{

float price;

char *name;

int coun;

char prod[50];

}

Конструктор по умолчаниюэто конструктор без параметров. Его можно не определять, но в случае описания массива экземпляров класса, или если в классе описаны поля как указатели, то память автоматически не выделится, поэтому конструктор по умолчанию нужно обязательно прописать!

Пример конструктора по умолчанию:

goods(){

name=new char[1];  

name[0]='\0';

prod[0]='\0';

coun=0;

price=0.0;}

Перегрузка конструкторов

Конструкторов может быть несколько и они могут перегружаться, т.е. вызов того или иного конструктора зависит от входных параметров при инициализации экземпляров класса.

Инициализация данных объекта:

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

Имя_класса (список_параметров): список_инициализаторов_компонентных_данных {тело_конструктора};

Пример перегруженного конструктора со списком инициализаторов:

goods(float p, int c): coun(c), price(p){ name=new char[1]; name[0]='\0'; prod[0]='\0';}

goods(char *new_name, float new_price):coun(1), price(new_price){

name=new char [strlen(new_name)+1];

strcpy(prod,"magazine"); strcpy(name,new_name); }

Копирующий конструктор

При описании экземпляров класса, в котором существуют динамические поля данных, можно использовать инициализацию через оператор присваивания. В этом случае простая передача данных передаст только адрес указателя, а не сами данные.

Для корректной работы программы нужно описать копирующий конструктор.

Копирующим называется конструктор, который в списке параметров содержит параметр типа определяемого класса:

имя_класса (const имя_класса &);

имя_класса (const имя_класса &, int=0);

Вызов копирующего конструктора производится так

имя_класса имя1_объекта_типа_класс = имя2_объекта_типа_класс;

имя_класса имя1_объекта_типа_класс(имя2_объекта_типа_класс);

Пример копирующего конструктора:

goods (const goods& f){

name=new char[strlen(f.name)+1];

strcpy(name, f.name);

coun=f.coun;

price=f.price;

strcpy(prod, f.prod);}

Деструктор (разрушитель объектов)

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

~имя_класса() {операторы_тела деструктора};

  •  Деструктор не имеет параметров (даже типа void).
  •  Деструктор не имеет возвращаемого значения.
  •  Вызов деструктора выполняется неявно, автоматически, как только объект класса уничтожается или завершается выполнение программы.

Пример описания деструктора:

~goods()

{

  delete name;

}

Пример # 3. Товары склада

#include <iostream>

#include <string.h>

using namespace std;

class goods{

float price;

char *name;

int coun;

char prod[50];

public:

goods(){

name=new char[1];  

name[0]='\0';

prod[0]='\0';

coun=0;

price=0.0;}

goods(float p, int c): coun(c), price(p){

name=new char[1]; name[0]='\0'; prod[0]='\0';}

goods(char *new_name, float new_price):coun(1), price(new_price){

name=new char [strlen(new_name)+1];

strcpy(prod,"magazine"); strcpy(name,new_name); }

goods (const goods& f){

name=new char[strlen(f.name)+1];

strcpy(name, f.name);

coun=f.coun;

price=f.price;

strcpy(prod, f.prod);}

~goods()

{

  delete name;

}

//Метод для вывода данных

void show(){ cout << name << ":“ << prod << «->“ << price << "*“ <<  

coun << "=“  << price*coun << endl;

}

};

//Главная программа

int main()

{

goods a("name",12.5);

goods c(56.0,100), d;

goods b=a;

a.show();    c.show();

d.show();    b.show();

return 0;

}

Пример #4. Символьная строка

Создадим класс «символьная строка». Определим следующие компоненты класса:

  •  Указатель на текстовую строку
  •  Длина строки
  •  Печатает информацию о строке

//stroka.cpp

#include <string.h>

#include <iostream.h>

#include <locale.h>

class stroka

{//скрытые от внешнего доступа данные

char *ch;

int len;

public://конструкторы объектов класса

stroka (int N=80): len(0)

{// выделяем память для массива строк

ch=new char[N+1];  ch[0]=‘\0’;}

// создает объект по заданной строке

stroka (const char *arch)

{len=strlen(arch); ch=new char[len+1]; strcpy(ch,arch);}

int& len_str(void)//возвращает ссылку на длину строки

{return len;}

char *strings(void)//возвращает указатель на строку                

{return ch;}

void display(void)//печатает  информацию о строке

{cout<<“\nДлина строки:”<<len;

cout<<“\nСодержимое строки:”<<ch;}

//Деструктор-освобождает память объекта

~stroka() { delete [] ch;} };

int main()

{

setlocale(LC_ALL,Russian”);

stroka s1,s2(5),s3("infoznaika");

cout << "Dlina stroki "<< s3.strings()<< "="<<s3.len_str()<< endl;

s2.display();

return 0;

}


 

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

31392. Разработка проекта информационной системы управления предприятием (по материалам ООО «Торг-Сервис», г. Краснодар) 616 KB
  Объектом исследования настоящей курсовой работы являются бизнес-процессы торговой организации ООО «Торг-Сервис». Целью работы является проектирование автоматизированной информационной системы управления предприятием. Методы исследования - аналитический, экспертный. Анализ и сравнение востребованных данных с течением времени. Методы аналогий и сравнений.
31393. СОЗДАНИЕ СТУДЕНЧЕСКОГО БЛОГА 2.79 MB
  Правила ведения блога. Структура блога ОПИСАНИЕ ПРЕДПРИЯТИЯ. В данной дипломной работе главное внимание уделяется решению вопроса создание блога в ССЭТ €œРодник€ формирования отчетной информации о денежных потоках ее анализа и использования в системе управления данным предприятием.
31394. Производственная преддипломная практика. Учебно-методический комплекс 123.5 KB
  Цели и задачи производственной преддипломной практики 3 База производственной преддипломной практики и рабочие места студентов 4 Содержание производственной преддипломной практики и методики указания к ее проведению 5 Индивидуальное задание по специальности 080115 Таможенное дело 6 Оформление результатов производственной преддипломной практики 7 Подтверждение итогов производственной преддипломной практики 1. Во время практики студентами должны быть закреплены и конкретизированы результаты теоретического обучения...
31395. Нивелирование 69 KB
  Нивелирование — вид геодезических работ, в результате которых определяют разности высот (превышения) точек земной поверхности, а также высоты этих точек над принятой отсчетной поверхностью.
31396. Учет ведения полюсов 61.69 KB
  Дано: Окончательный расчет рисков страхования. Требуется: Составить сводную таблицу выданных полюсов страхования. Периодичность и область применения: Сводная таблица выданных полюсов страхования на момент запроса составляется ежеквартально. Техноэкономическая эффективность: Автоматизированное составление вывести сводную таблицу выданных полюсов страхования момент запроса существенно повысит эффективность работы организации.
31397. Мониторинг страховых случаев без учета ущерба 62.79 KB
  Цель задачи: Осуществить мониторинг всех страховых случаев объектам страхования и расчет стоимости ущерба. Дано: Сводная таблица выданных полюсов страхования Заявление на страховой случай Справочник клиентов. Требуется: Определить расчет ущерба по объекту страхования Организационноэкономическая сущность: Данная задача состоит в том чтоб собрать всю информацию по страховым случаям в одну таблицу для дальнейшего анализа. Периодичность и область применения: Ведомость расчета ущерба по объекту страхования на момент запроса составляется...
31398. Алгоритм 25.04 KB
  Алгоритм, алгорифм (ағылшынша: algorіthm, algorіsmus Әл-Хорезмидің атынан шыққан) - бастапқы берілген мәліметтермен бір мәнде анықталатын нәтиже алу үшін қай амалды (жұмысты) қандай ретпен орындау қажеттігін белгілейтін есептерді
31399. Учет заявок на страхование 62.02 KB
  Дано: Справочник страховщиков Заявка от клиента. Для обновления такого рода информации нам потребуются следующие входные документы: Справочник страховщиков Заявка от клиента. Данные документы приходят из отдела персонала и отдела по работе с клиентами. Мы собираем все имеющиеся данные обо всех заявках клиентах и объектах.
31400. Формирование доходов и политика их перераспределения в современной экономике 86.73 KB
  Социальная направленность реформирования российской экономики находит практическое проявление в социальной политике государства. Государственная социальная политика - это целенаправленная деятельность государства, ставящая своей целью ослабление дифференциации доходов