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;

}


 

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

78974. Теоретический уровень научного познания и его методы 37 KB
  Теоретический уровень научного познания и его методы Теоретический уровень высший уровень научного познания включает факты добытые эмпирическим путем предшествующие развитию науки а также логические выводы добытые разумом человека. Абстрагирование Процесс познания всегда начинается с рассмотрения конкретных чувственно воспринимаемых предметов и явлений их внешних признаков свойств связей. является необходимым моментом процесса познания.
78975. Кумулятивистская и антикумулятивисткая модели развития науки, концепции Поппера, Куна, Лакатоса 30.5 KB
  Кумулятивистская и антикумулятивисткая модели развития науки концепции Поппера Куна Лакатоса. Концепция Куна Кун считает что развитие науки представляет поцесс поочередной смены двух периодов нормальной науки и научной революции. Причем последние гораздо более редки в истории развития науки по сравнению с первыми. Характер концепции Куна определяется пониманием научного сообщества члены которого разделяют определенную парадигму приверженность к которой обуславливается положением его в данной социальной организации науки принципами...
78976. КОНЦЕПЦИЯ НАУЧНЫХ РЕВОЛЮЦИЙ Т.КУНА 40 KB
  История науки по Куну: Согласно книге Структура научных революций Т.Куна историю науки можно представить следующей схемой: 1 При переходе к зрелой науке на основе идей одной или нескольких научных школ возникает общепринятая парадигма; 2 одно из главных направлений деятельности нормальной науки обнаружение и объяснение фактов как фактов подтверждающих парадигму; 3 при таком исследовании часть фактов трактуется как аномалии факты противоречащие парадигме; 4 в период кризиса доверие к парадигме в известной степени подорвано но...
78978. Особенности становления и основные принципы неклассической науки 43 KB
  Планк квантавая теория Резенфорд планетарная модель атома Ренген ренгеновские лучи Все эти открытия разрушили картину мира. Основные принципы: Установка на невозможность описать мир сам по себе Установлено различие в организации и развитии 3х уровней мира: макро микро мега. Нет качественной однородности в мега микро и макромирах Вероятностный детерменизм Признавалась роль случайностей. Случайность равноценный фактор необходимости Объект исследования не вещи а процессы Принципиально невозможно найти первокирпичик мира т.
78979. Понятие рациональности, научной рациональности. Виды и типы научной рациональности 48 KB
  Понятие рациональности научной рациональности. Виды и типы научной рациональности. В самой идее рациональности можно увидеть символ современной научно-технической цивилизации со всеми ее особенностями и противоречиями. Ее началом является некоторый тип активно-преобразовательного отношения человека к миру с которым и связывается как правило сама идея рациональности.
78980. Пространство и время в современной и классической картине мира 35 KB
  Пространство и время в современной и классической картине мира. Пространство есть форма координации сосуществующих объектов состояний материи. Пространство и время это всеобщие формы существования координации объектов. Пространство и время в классической картине мира.
78981. Философское значение синергетики 41 KB
  В своей классической работе Синергетика он отмечал что во многих дисциплинах от астрофизики до социологии мы часто наблюдаем как кооперация отдельных частей системы приводит к макроскопическим структурам или функциям. Синергетика в ее нынешнем состоянии фокусирует внимание на таких ситуациях в которых структуры или функции систем переживают драматические изменения на уровне макромасштабов. По мнению ученого существуют одни и те же принципы самоорганизации различных по своей природе систем от электронов до людей а значит речь должна...
78982. Этос науки и императивы, регулирующие поведение ученого 32.5 KB
  Понятие Императив и Этос науки Императив лат. Этос науки набор внутренних социальных норм которых придерживаются ученые в научной деятельности и которые обеспечивают функционирование социального института науки. Нормы этоса науки Попытка кодификации социальных норм науки была предпринята Р.