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;

}


 

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

42248. Использование форм в Web-страницах. Вставки форм в Web-страницах 267.5 KB
  Использование форм в Webстраницах Целью работы является знакомство с элементами вставки форм в Webстраницах. Программное обеспечение: операционная система Windows Webбраузер Internet Explorer версии 6. Модуль Bsic Forms Формы HTML первоначально были предназначены для пересылки данных от удаленного пользователя к Webсерверу.
42249. Работа с объектом window, анимация. Создание интерактивных Web-страниц с использованием языка сценариев JavaScript 165 KB
  Целью работы является овладение навыками работы с окнами типа window при создании интерактивных Webстраниц с использованием языка сценариев JvScript. Программное обеспечение: операционная система Windows Webбраузер Internet Explorer версии 6. Объект window в JvScript Все Webбраузеры выводят пользователям Webстраницы в окне дисплея. Объект window представляет текущее окно Webбраузера или отдельный фрейм если окно разделено на фреймы.
42250. Організація виконання вантажних операцій 540.5 KB
  Структура управління вантажними операціями на залізничному транспорті. Вибір раціонального варіанта механізації навантажувально-розвантажувальних робіт. Основні параметри вантажно-розвантажувальних машин. Показники надійності вантажно-розвантажувальних машин. Застосування і класифікація навантажувачів...
42251. ЭЛЕКТРОМАГНИТ ПОСТОЯННОГО ТОКА 66 KB
  При протекании тока по обмоткам электромагнита создается электромагнитная сила притягивающая магнитную систему к неподвижному якорю. Сила тяги электромагнита через рамку 6 воздействует на пружину 7 которая действует на индикатор перемещения поворачивая стрелку 8. Питание электромагнита осуществляется от источника 220 В через трансформатор Тр и двухполупериодный выпрямительный мост В. Изучить принципиальную схему электромагнита.
42252. КОНТРОЛЬ МАЛОЙ КЛИНОВИДНОСТИ ПЛАСТИН НА ИНТЕРФЕРОМЕТРЕ ЧАПСКОГО 302 KB
  Рассмотрим возникновение полос равного наклона и определим величину разности хода лучей отраженных под некоторым углом от плоскопараллельной пластины рис. Если поверхности пластины образуют между собой малый угол  то изображения источника 1 в фокальной плоскости 6 разойдутся на расстояние l =n где  фокусное расстояние линзы 5. Первый случай соответствует перемещению пластины в сторону увеличения её толщины второй в сторону уменьшения. Появление или исчезновение кольца соответствует изменению толщины пластины на величину .
42253. Выполнение базовых преобразований на плоскости 98.5 KB
  Трансляция точки выполняется путем добавления смещения [m n] к ее координатам [x y], в результате чего получается точка с новыми координатами. Для объекта, описываемого множеством точек, все точки объекта перемещаются на одинаковые расстояния вдоль параллельных прямых. В матричной форме трансляция выполняется путем умножения однородных координат точки на матрицу трансляции
42254. Базовые алгоритмы 2D-геометрии 638.5 KB
  Геометрически каждая точка на плоскости задается значениями координат радиусвектора относительно выбранной системы координат. В этом случае объект поворачивается относительно оси вращения перпендикулярной плоскости xoy. Наиболее распространен сдвиг в направлении оси x и сдвиг в направлении оси y. Сдвиг выполняется путем умножения однородных координат точки на матрицу сдвига: сдвиг в направлении оси y сдвиг в направлении оси x.
42255. МИКРОПРОГРАММИРОВАНИЕ КОМАНД СМ ЭВМ 75 KB
  Знакомство с принципами микропрограммной эмуляции ЭВМ с программным управлением микропрограммирование машинных команд СМ ЭВМ. Вывод: В ходе работы я ознакомился с принципами микропрограммной эмуляции ЭВМ с программным управлением приобрел навыки микропрограммирования машинных команд СМ ЭВМ.
42256. EMBED PBrush 1007.5 KB
  rry1 db 123423 rry2 db 1500 dup rry3 db 2000 dup 56h В першому випадку кожний елемент масиву ініціалізується незалежно. Багатовимірний масив задається шляхом використання вкладених повторень dup наприклад r1 db 4 dup 3 dup 2 dup В мові Паскаль це еквівалентно наступному оператору r1:rry[0. Наприклад Instr32 struc Opcode dw Modrm db Sib db Disp dd Instr32 ends Сама структура задається в форматі директив визначення даних де в полі мнемокода задається ім'я структури наприклад In1 instr32 Або Min1 instr32 5...