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


 

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

68200. ФОРМУВАННЯ ПРОФЕСІЙНОЇ КОМПЕТЕНТНОСТІ МАЙБУТНІХ ЕКОНОМІСТІВ ЗАСОБАМИ МЕРЕЖЕВИХ ТЕХНОЛОГІЙ 305 KB
  Інтеграція України до європейського економічного й інформаційного простору, поява нових сфер економічної діяльності тісно інтегрованих із інформаційними технологіями, що постійно оновлюються, зумовлюють необхідність у підвищенні якості економічної освіти та супроводжуються зростанням...
68201. ТЕОРІЯ І МЕТОДИКА ПРОЕКТУВАННЯ СИСТЕМИ ПЕДАГОГІЧНОЇ ПІДГОТОВКИ МАЙБУТНІХ ІНЖЕНЕРІВ-ПЕДАГОГІВ 523.5 KB
  Реалізація соціального замовлення суспільства на формування у майбутніх інженерівпедагогів умінь аналізувати прогнозувати та обирати раціональні шляхи й засоби навчання вимагає таких методологічних підходів які б забезпечували оновлення концепцій професійної педагогічної підготовки...
68202. ЗАДАЧІ З РУХОМИМИ МЕЖАМИ ДЛЯ ГІПЕРБОЛІЧНИХ СИСТЕМ КВАЗІЛІНІЙНИХ РІВНЯНЬ 1.29 MB
  Багато математичних моделей природознавства містять задачі з нелокальними нерозділеними або інтегральними крайовими умовами. Крайові задачі з нелокальними умовами для систем гіперболічних рівнянь досліджували...
68203. ЗАСТАВА В СИСТЕМІ МЕНЕДЖМЕНТУ КРЕДИТНОГО РИЗИКУ БАНКУ 283 KB
  У загальній структурі кредитних вкладень банків тільки 29 займає стандартна заборгованість при якій обслуговування боргу позичальником відповідає умовам кредитної угоди вказує на доцільність вивчення причин чому не спрацював механізм застави і банки не змогли відшкодувати належним чином...
68204. ІСТОРИКО-КНИГОЗНАВЧЕ ДОСЛІДЖЕННЯ ВИДАНЬ І. ФЕДОРОВА ТА П. МСТИСЛАВЦЯ: ФІЛІГРАНОЛОГІЧНИЙ АСПЕКТ 152.5 KB
  З цією метою здійснено історикокнигознавче дослідження водяних знаків їхніх спільних та окремих видань насамперед великоформатних для введення у науковий обіг відомостей історії друкування видань почерговості публікації їх частин історії закупівлі паперу виявлення невідомих раніше варіантів...
68205. ВИКОРИСТАННЯ ІМПОРТНОЇ СИРОВИНИ В ПАРФУМЕРНО-КОСМЕТИЧНІЙ ПРОМИСЛОВОСТІ: ОБЛІКОВО-КОНТРОЛЬНІ АСПЕКТИ 272.5 KB
  Для сучасних світових тенденцій економічного розвитку характерне зростання ролі зовнішньоекономічної діяльності. В процесі її здійснення виникають певні проблеми, зумовлені невідповідністю принципів вітчизняних стандартів бухгалтерського обліку вимогам митного та податкового законодавства...
68206. ФОРМУВАННЯ ЛІДЕРСЬКИХ ЯКОСТЕЙ МАЙБУТНІХ ЕКОНОМІСТІВ У ПРОЦЕСІ ПРОФЕСІЙНОЇ ПІДГОТОВКИ 247 KB
  Майбутні економісти потребують не тільки широкої загальної освіти а й розвинених лідерських якостей оскільки ця професія повязана з роботою у команді прийняттям рішень на основі аналізу ситуації умінням нести відповідальність за наслідки рішень ефективною організацією роботи не лише однієї...
68207. АГРОЕКОЛОГІЧНЕ ОБҐРУНТУВАННЯ ЗАХОДІВ ПОЛІПШЕННЯ ЯКОСТІ ПИТНОЇ ВОДИ ДЕЦЕНТРАЛІЗОВАНОГО ВОДОПОСТАЧАННЯ 1.1 MB
  Забруднювачі з ґрунту безпосередньо впливають на хімічний склад суміжних середовищ у тому числі й води підземних джерел. Оскільки ґрунтові води не захищені водотривкими породами а їх живлення відбувається в результаті фільтрації атмосферних опадів через інколи незначний 152 м завтовшки...
68208. ТЕХНОЛОГІЯ СОУСІВ ЯГІДНИХ З ВИКОРИСТАННЯМ ПРИРОДНОЇ НЕТРАДИЦІЙНОЇ СИРОВИНИ 975.5 KB
  Слід підкреслити що останнім часом все більшого розповсюдження у ресторанному господарстві набуває креативна кухня яка характеризується додаванням до страв з мяса риби птиці дичини солодких соусів з плодів та ягід асортимент яких обмежується вишневим чорносмородиновим сливовим соусами...