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;

}


 

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

27088. Корпоративная информационная система(КИС) 12.02 KB
  Основными блоками корпоративных информационных систем являются: система хранения база данных хранилище; система сбора и концентрации информации; системы поддержки принятия решений бизнеслогика базируется на обработке; специальные взаимодействия.
27089. ОСНОВНІ ВІДОМОСТІ ПРО ВАГОНИ. ТИПИ, ЗАГАЛЬНА БУДОВА, ТЕХНІКО-ЕКОНОМІЧНІ ПОКАЗНИКИ ВАГОНІВ. ПОЗНАЧКИ ТА НАДПИСИ НА ВАГОНАХ 337.5 KB
  Типи та конструкції сучасних вантажних, пасажирських та рефрижераторних вагонів являють собою доволі складну інженерну побудову. Тому інженери, що працюють в системі вагонного господарства залізничного транспорту та в вагонній промисловості, повинні добре знати конструкцію вагонів
27090. Архитектура CRM систем 91.83 KB
  архитектура CRM систем CRMсистема Customer Relationship Management System система управления взаимодействием с клиентами корпоративная информационная система предназначенная для улучшения обслуживания клиентов путём сохранения информации о клиентах и истории взаимоотношений с клиентами установления и улучшения бизнеспроцедур на основе сохранённой информации и последующей оценки их эффективности. Её основные принципы таковы: наличие единого хранилища информации откуда в любой момент доступны все сведения обо всех случаях...
27091. Архитектура erp систем 35.49 KB
  архитектура erp систем В начале 1990х гг. Системы класса MRPII в интеграции с модулемфинансового планирования Finance Requirements Planning FRP получили название систем планирования ресурсов предприятийEnterprise Resource Planning ERP. В основе ERPсистем лежит принцип создания единого хранилища репозитория данных содержащего всю корпоративную бизнесинформацию: плановую и финансовую информацию производственные данные данные по персоналу и др. Целью ERPсистем является не только улучшение управления производственной деятельностью...
27093. Организация процессов обработки данных в базе данных: формы, запросы, отчеты 38 KB
  Основными компонентами объектами базы данных являются таблицы запросы формы отчеты макросы и модули.Таблица фундаментальная структура системы управления реляционными базами данных. В Microsoft Access таблица это объект предназначенный для хранения данных в виде записей строк и полей столбцов.
27094. Понятие и функции базы данных. Предметная область 13.87 KB
  Основные предметнозначимые сущности: Книги Читатели. Основные предметнозначимые атрибуты сущностей: книги автор книги название год издания цена является ли новым изданием краткая аннотация; читатели номер читательского билета ФИО адрес и телефон читателя. Основные требования к функциям системы: выбрать книги которые находятся у читателей или определенного читателя; выбрать читателей которые брали ту или иную книгу с указанием даты выдачи книги и даты сдачи книги читателем; ...
27095. Реляционная модель данных и реляционные СУБД.Типы связей и их реализация 22.21 KB
  Реляционная модель данных и реляционные СУБД. Реляционная модель данных логическая модель данных. Реляционная модель данных включает следующие компоненты: Структурный аспект составляющая данные в базе данных представляют собой набор отношений. РМД поддерживает декларативные ограничения целостности уровня домена типа данных уровня отношения и уровня базы данных.
27096. Система управления базами данных (СУБД). Функции и объекты СУБД 78 KB
  Функции и объекты СУБД Система управления базами данных СУБД совокупность программных и лингвистических средств общего или специального назначения обеспечивающих управление созданием и использованием баз данных. Функции СУБД: управление данными во внешней памяти на дисках; управление данными в оперативной памяти с использованием диского кэша; журнализация измененийрезервное копирование и восстановление базыданных после сбоев; поддержка языков БД язык определения данных язык манипулирования данных. Объекты СУБД: К объектам СУБД...