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   [ ], щоб можна було викликати деструкцію для кожного об'єкту окремо.


 

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

60413. Найдавніші землероби та скотарі на території України. Трипільска культура 35.5 KB
  Мета: розповісти про появу землеробства й скотарства за часів неоліту; ознайомити учнів з трипільською культурою господарством духовним життям скотарів степу; опрацьовувати вміння працювати з картою висловлювати власну думку...
60414. Українські землі в складі Литви та Польщі 60.5 KB
  Оголошення проблемного запитання: Чи могли українські землі в ХІVХVІ ст. Коментоване читання 1-го абзацу Після занепаду Галицько-Волинської держави Запитання: Що намагався відродити князь Любарт...
60415. Включення українських земель до складу Російської та Австрійської імперій 164 KB
  Які держави брали участь у поділах Речі Посполитої Яка була їхня мета Як ви оцінюєте значення поділів Речі Посполитої для українського народу Які землі увійшли до складу Росії після російсько-турецьких війн...
60416. Планета Земля чекає на захист 303.5 KB
  Мета. Узагальнити та розширити знання учнів про стан природи нашої планети; розкрити деякі екологічні проблеми.
60417. Розробка позакласного заходу Земля моя – Луганщина 62 KB
  Обладнання: карта України виставка книжок портрети відомих людей плакат Земля моя Луганщина герб Луганської області Хід уроку Слово вчителя. Тема нашого уроку Земля моя –Луганщина.
60418. Загальна характеристика класу Земноводні 405.5 KB
  Мета: сформувати в учнів знання про наступний клас типу Хордові Земноводні; ознайомити учнів із середовищем існування земноводних їх способом життя; розглянути зовнішню будову на прикладі жаби озерної...
60419. Особливості процесів життєдіяльності та поведінки Земноводних 139 KB
  Мета: продовжувати формувати знання учнів про земноводних тварин; розкрити особливості внутрішньої будови земноводних системи органів; ознайомити із особливостями процесів життєдіяльності...
60420. Загальна характеристика класу Земноводні 48 KB
  Так саме жаби зробили неоціненний вклад в розвиток науки. До земноводних належать жаби ропухи тритони саламандри прочитав Сашко тихим голосом і замовк. Полудень і жаби підставили свої спини яскравим сонячним променям.
60421. Школьный пресс-центр как интеллектуально-творческое объединение учащихся 73 KB
  Оформление наглядности: создание настенных плакатов отражающих работу пресс-центра. 1 Приобретение канцтоваров Попечительский совет 2 Оплата энергопотребления Попечительский совет...