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


 

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

60290. Класифікація та причини виникнення надзвичайних ситуацій мирного часу 99 KB
  Надзвичайні ситуації природного характеру розрізняють на: ситуації 1 Геологічного походження землетруси обвали природного 2 Мете реологічного смерчі бурі урагани зливи ожеледь морози характеру...
60291. ПОЭЗИЯ И РУССКИЙ РОМАНС (А. ФЕТ и Ф. ТЮТЧЕВ) 6.03 MB
  Стоит учесть, что лирика не терпит аналитического препарирования. Многие старшеклассники иронично относятся к открытому проявлению эмоций, стесняются проявить их. А уж русский романс они вообще не знают.
60293. Мы и закон (Первое и последнее знакомство с УК) 93.5 KB
  Сформировать у учащихся представление о видах преступлений за которые несовершеннолетние несут ответственность. Воспитывать понимание совершение поступков ответственность за свои действия.
60294. Наш закон – наша сила 60.5 KB
  Звучить Гімн України Любі діти маленькі українці сьогодні відбудеться святкова інтелектуальна гра на якій присутні шановні гості та батьки. Діти а що б було якби люди стали поводитись без правил Діти. Діти які ви знаєте правила Діти. Діти ви кажете правила закон право.
60295. РАЗВИТИЕ РЕЧИ. ЗАКОНЫ ОБЩЕНИЯ. МАСТЕРСТВО КОММУНИКАЦИИ 70 KB
  Главная роскошь на земле - роскошь человеческого общения мудро заметил А. Наши учащиеся к сожалению теряют навыки общения навыки владения языком как средством коммуникации. Сегодня учитель на мой взгляд должен не только давать минимум знаний...
60297. Виконання кольорових розтяжок в теплих і холодних тонах. Змішування кольорів 213 KB
  Виконання роботи аквареллю є досить клопіткий і водночас цікавий процес кий потребує наполегливості спостережливості відчуття кольору і гри світла. Акварельна фарба любить прозорість майже виключає примінення чорного кольору.
60298. Потреби і виробничі можливості суспільства. Економічні інтереси 460.5 KB
  Методична розробка пропонує використання інтерактивних методів навчання, таких як, дослідницька робота студентів (робота з документами, обробка статистичних даних, анкетування, соціологічне опитування студентів та працівників технікуму, а також мешканців міста, соціологічне опитування населення м. Маріуполь в співпраці з міським телеканалом ТВ – 7)...