Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB01.DOC
Скачиваний:
0
Добавлен:
11.11.2019
Размер:
70.66 Кб
Скачать

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

Конструктори і деструктори - це спеціальні методи класу, які явно або неявно викликаються при створенні або знищенні об’єктів. Кожний клас повинен мати хоч би один конструктор, але, як правило, задаються декілька. Конструктор відіграє дві ролі. Головна - створення "пустого" об’єкта, тобто розподіл пам’яті для змінних класу цього об’єкта. Друга - ініціалізація стану об’єкта, тобто заповненя "пустого" об’єкта. Саме в конструкторі визначається, якими значеннями потрібно проініціалізувати змінні об’єкта.

Іменем конструктора є ім’я класу. Конструктор по замовчуванню не має параметрів, або всі його параметри отримують значення по замовчуванню. Він викликається завжди без параметрів. Якщо у визначенні класу конструктор не оголошений, то автоматично створюється конструктор по замовчуванню з пустим тілом і який виконує головну роль без ініціалізації. Наприклад, в результаті обробки компілятором оголошення об’єкта.

Patient Petrov;

викликається конструктор по замовчуванню - або визначений в класі Patient, або створений компілятором.

Існують ще два спеціальних типи: конструктор копії і конструктор перетворення типу. Перший має один параметр - константу, або звичайну зсилку на об’єкт даного класу, і дозволяє при ствоворенні об’єкта ініціювати його занченням іншого об’єкта.

Другий має також один параметр, тип якого відрізняється від типу, який задається класом конструктора, і ініціалізує новий створюваний об’єкт класу об’єктом інакшого типу, заданого в його параметрі. Фактично відбувається перетворення типу, заданого параметром, до типу, визначеного класом. Приведемо приклади оголошення всіх типів в класі Patient:

class Patient

{

// Atibutes

private:

CString m_sName; int m_n Age;

// Constructors

// Конструктор по замовчуванню

Patient (CString name = "Ivanov", int age = 33);

// Нормальний конструктор з ініціалізацією

// Patient (CString name = “Ivanov”, int age = 33);

// Зауважте : Два цих конструктори не

// можуть бути визначен· одночасно

// Конструктор копії

Patient (const Patient & source);

// Конструктор перетворення

Patient (CString name);

// Інші оголошення - можливі;

}

Тепер можна написати реалізацію цих конструкторів:

// Конструктор по замовчуванню

Patient :: Patient (CString name = "Ivanov", int age = 33)

{

m_s Name = name;

m_n Age = age;

}

// Нормальний конструктор

Patient :: Patient (CString name, int age)

{

m_s Name = name;

m_n Age = age;

}

// Констуктор копії

Patient :: Patient (const Patient & source)

{

m_s Name = source. m_s Name;

m_n Age = source. m_n Age;

}

// Конструктор перетворення типу

Patient :: Patient (CString name)

{

m_s Name = name;

}

Тепер стають можливими оголошення об’єктів, які приводять до виклику відповідних конструкторів:

// Виклик конструктора по замовчуванню

Patient NN;

// Виклик конструктора з ініціалізацією

Patient Ivanov ("Ivanov",35);

// Виклик конструктора копії

Patient theSameIvanov (Ivanov);

// Виклик конструктора перетворення

Patient Petrov ("Petrov");

Деструктор - це метод явного, або неявного знищення об’єкта. Наприклад, при виході з блоку всі локальні об’єкти знищуються і для цього викликається деструктор. Зв·льняючи пам’ять, яка зайнята об’єктом, деструктор знищує всі результати роботи конструктора. Тіло декструктора, як правило - пусте, оскільки система сама звільняє пам’ять. Але якщо конструктор явно розподіляє пам’ять для змінних об’єкта за допомогою оператора new, то в тілі деструктора має бути оператор delete, який · звільняє цю пам’ять.

Ім"я десктруктора - це ім’я відповідного класу з префіксом "~". Наприклад, ~ Patient () - деструктор класу Patient.

1.4. Приклад.

Обчислити напругу в колі змінного струму по формулі:

Z = R + jwL + 1/(jwc) для імпедансу і V = Z*j для напруги,

де L - індуктивність,

R - опір,

С - ємність,

w = 2*p*f, p = (число 3.14156...)

f - частота.

*

У файл Сcomplex.h помістимо опис класу Сcomplex:

class Ccomplex

{

double re, im;

public:

Ccomplex (double r, double i);

Ccomplex ();

~Ccomplex ();

void print ();

friend Ccomplex operator + (Ccomplex, Ccomplex );

friend Ccomplex operator * (Ccomplex, Ccomplex );

friend Ccomplex operator / (Ccomplex, Ccomplex );

};

// class Ccomplex - end //

*******

//Файл реалізації Ccomplex.сpp має вигляд: //

Ccomplex :: Ccomplex (double r, double i)

re = r;

im = i;

Ccomplex :: Ccomplex ()

re = 0.;

im = 0.;

Ccomplex :: ~Ccomplex ()

void Ccomplex :: print ()

printf ("(%5.2f,%5.2f)\n",re,im);

Ccomplex operator + (Ccomplex a, Ccomplex b)

{

return Ccomplex (a.re + b.re, a.im + b.im);

}

Ccomplex operator * (Ccomplex a, Ccomplex b)

{

double aa = a.re * b.re - a.im * b.im;

double bb = a.re * b.im + a.im * b.re;

return Ccomplex (aa,bb);

}

Ccomplex operator / (Ccomplex a, Ccomplex b)

double r = b.re;

double i = b.im;

{

double tr,ti;

tr = r < 0? - r:r;

ti = i < 0? - i:i;

if ( tr <= ti)

{

ti = r/i;

tr = i * (1. + ti*ti);

r = a.re;

i = a.im;

}

else

ti = -i/r;

tr = r * (1. + ti*ti);

r = -a.mi;

i = a.re;

}

return Ccomplex ((r*ti + i)/tr, (i*ti - r)/tr);

}

Прикладнa програмa з використaнням файл·в Ccomplex.h i Ccomplex.cpp:

#include <stdio.h>

#include "Ccomplex.h"

#include "Ccomplex.cpp"

void main ()

{

const Ccomplex j(0,1);

const double pi = 3.1415926;

double

R = 5000.,

c =0.02,

L = 0.03,

f = 60,

Om = 2.*pi*f;

Ccomplex i(12,0), Z,V,OM(Om,0);

Z = R + j * OM * L + 1./(j * OM * c);

V = Z * i;

V.print ();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]