69716

Виділення пам’яті для об’єктів

Лекция

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

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

Украинкский

2014-10-09

42 KB

0 чел.

Тема 6: Виділення пам'яті для об'єктів

Використовуючи оператора new, можна динамічно виділяти пам'ять для об'єктів. В цьому випадку оператора поверне покажчик на створений об'єкт. Динамічно створений об'єкт нічим не відрізняється від інших. При його створенні також викликається конструктор (якщо він передбачений), а при звільненні пам'яті викликається відповідна деструкція.

Розглянемо невелику програму, в якій визначений клас balance, призначений для зберігання імені людини і суми, лежачої на його банківському рахунку. Усередині функції main() об'єкт класу balance створюється динамічно.

#include <iostream>

#include <new>

#include <cstring>

using namespace std;

class balance {

double cur_bal;

char name[80];

public:

void set(double n, char *s)

{

cur_bal = n; strcpy(name, s);

}

void get_bal(double &n, char *s)

{

n = cur_bal; strcpy(s, name);

}

};

int main()

{

balance *p;

char s[80];

double n;

try {

p = new balance;

} catch (bad_alloc ха){

cout « "Виняткова ситуация \n";

return 1;

p->set(12387.87, "Ральф Уїлсон");

p->get_bal(n, s);

cout << s << ": сума = " « n; cout << "\n";

delete p;

return 0;

}

Оскільки змінна р є покажчиком на об'єкт, для доступу до його членів використовується оператор "->".

Як відомо, динамічні об'єкти можуть містити конструктори і деструкцію. Крім того, конструктори можуть мати параметри. Розглянемо модифікацію попередньої програми.

#include <iostream>

 #include <new>

#include <cstring>

using namespace std;

class balance {

double cur_bal;

char name[80];

public:

balance(double n, char *s) { cur_bal = n; s trcpy(name, s); }

~balance() {

cout << "Знищення об'єкту ";

cout « name « "\n";

}

 void get_bal(double &n, char *s)

{

n = cur_bal;

strcpy(s, name);

}

};

int main() {

balance *p;

char s[80];

double n;

// У цій версії використовується ініціалізація

try {

р = new balance (12387.87, "Ральф Уїлсон");

} catch (bad_alloc ха) {

cout << "Виняткова ситуация\ п";

return l ;

}

p->get_bal(n, s);

cout «  s  «   ": сума = " << n; cout << "\n";

delete p;

return 0;

}

Звернете увагу на те, що параметри конструктора об'єкту вказані після імені типу, як при звичайній ініціалізації.

У динамічній пам'яті можна розмістити масиви об'єктів, проте слід мати на увазі одну пастку. Масиви, розміщені в динамічній пам'яті за допомогою оператора new, не можна ініціалізувати, тому слід переконатися, що клас містить конструктор, що не має параметрів. Інакше компілятор мови C++ не знайде відповідного конструктора і при спробі розмістити масив в динамічній пам'яті видасть повідомлення про помилку.

У наступній версії наший програми в динамічній пам'яті розміщується масив balance, і викликається конструктор, що не має параметрів.

#include <iostream>

#include <new>

#include <cstring>

using namespace std;

class balance {

double cur_bal;

char name[80];

public:

balance(double n, char *s) { cur_bal = n; strcpy(name, s); }

balance() {} // Конструктор без параметрів

~balance() {

cout << "Знищення об'єкту ";

cout << name « "\n";

}

void set(double n, char *s){

cur_bal = n;

strcpy(name, s);

}

void get_bal(double &n, char *s){

n = cur_bal;

strcpy(s, name);

}

int main() {

balance *p;

char s[80];

double n;

int i ;

try {

p = new balance [3]; // Розміщення масиву

} catch (bad_alloc ха) {

cout << "Виняткова ситуация\ п";

return 1;

}

// Використовується оператор ., а не ->

p[0].set(12387.87, "Ральф Уїлсон");

p[l].set(144.00, "А. С. Коннерс");

p[2].set(-11.23, "І. М. Овердроун");

for(i=0; i<3; i++){

p[i].get_bal(n, s);

cout « s << ": сума = " « n; cout « "\n";

}

delete [] p; return 0;

}

В результаті роботи цієї програми на екран будуть виведені наступні рядки.

Ральф  Уїлсон:   сума  =   12387.9

А.   С.   Коннерс:   сума  =   144

І.   М.   Овердроун:   сума  =   -11.23

Знищення  об'єкту І.   М.   Овердроун

Знищення  об'єкту А.   С.   Коннерс

Знищення  об'єкту  Ральф  Уїлсон

Для знищення масиву динамічних об'єктів слід застосовувати оператора delete   [ ], щоб можна було викликати деструкцію для кожного об'єкту окремо.


 

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

44481. Разработка мероприятий по совершенствованию учета основных средств и повышению экономической эффективности их использования в ООО «Бельки» Касимовского района Рязанской области 696 KB
  ТЕОРЕТИЧЕСКИЕ АСПЕКТЫ УЧЕТА И АНАЛИЗА ЭФФЕКТИВНОСТИ ИСПОЛЬЗОВАНИЯ ОСНОВНЫХ СРЕДСТВ НА ПРЕДПРИЯТИЯХ АПК Экономическое содержание учета основных средств Анализ движения и экономической эффективности использования основных средств БУХГАЛТЕРСКИЙ УЧЕТ ОСНОВНЫХ СРЕДСТВ
44482. Ауыз қуысы, бөлінуі, шекаралары, құрамы 15.3 KB
  Ауыз қуысы, топографиялық орналасуына және атқаратын қызметіне қарай ауыз кіреберісі, мен меншікті ауыз қуысына бөлінеді
44483. Христианская церковь в средние века 105.5 KB
  При Иннокентии IV 12451254 было объявлено что кардинал стоит выше епископов и должен носить красную шапку символизирующую что кардинал готов бороться в защиту святой римской церкви до последней капли крови. в западной церкви было сделано дополнение непризнанное грековизантийской церковью об исхождении святого духа не только от бога отца но и от...
44484. Шықшыт, жақсүйекасты, тіласты сілекей бездері, орналасуы, құрылысы, шығару жолдары 15.86 KB
  Без өзегі жақаралық кеңістікпен алға қарай бағытталып, төменгіжақтын тамырлы ойығы арқылы жақтың сыртқы бүйір бетіне шығады да...
44485. МЕТОДИЧНІ РЕКОМЕНДАЦІЇ для виконання самостійної роботи з дисципліни «ХІМІЯ» 1.71 MB
  Методичні рекомендації розроблено з метою полегшення набуття та закріплення знань студентів шляхом самостійної роботи над програмним матеріалом. Містить питання, які виносяться на самостійне опрацювання, завдання для розвʼязання поставлених питань та тестові завдання для контролю знань з хімії...
44486. ОПРЕДЕЛЕНИЕ ИНДУКТИВНОСТИ КАТУШКИ 2.14 MB
  В методических указаниях представлена следующая информация: название лабораторной работы, цель, краткие теоретические сведения, перечень оборудования, методика проведения эксперимента, методика обработки экспериментальных данных, контрольные вопросы, требования к содержанию отчета о лабораторной работе, список литературы, приложение со справочными материалами.
44488. Аналіз правової діяльності ТОВ Сумська насосна техніка 1.11 MB
  Основним завданням, яке було поставлено переді мною, було закріплення на практиці досягнутих під час навчання знань з правових дисциплін, засвоїти навики у веденні діловодства підприємства, набратися достатнього досвіду роботи, яка пов’язана з його функціонуванням, підсумувати досягнуті знання та проаналізувати можливість застосування цих знань на практиці.
44489. Канали зв’язку всучасних комп’ютерних мережах 56.11 KB
  Підтримка мереж в Debian`і є дуже схожою з класичними дистрибутивами Linux. Однак, якщо ви – новачок у Дебіені, деякі речі можуть бути вам невідомі. Короткий вступ до налаштування мережі у Debian GNU/Linux покаже вам, як усе це працює у даному дистрибутиві.