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


 

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

56594. Використання елементів інтерактивних технологій на уроках української мови 245 KB
  Мета. Активізувати розумову діяльність учнів спрямовану на узагальнення знань навичок набутих у процесі вивчення теми Іменник як частина мови; удосконалювати орфографічні навички; розвивати мислення і здібності школярівпідвищувати культуру мовлення...
56595. ПОНЯТИЕ КАЧЕСТВА СОЦИАЛЬНО-КУЛЬТУРНЫХ УСЛУГ В ИСТОРИИ ЭКОНОМИЧЕСКИХ УЧЕНИЙ 242.5 KB
  Совокупность предприятий, учреждений, организаций, осуществляющих производство, перераспределение, сохранение и организацию потребления товаров и услуг социально-культурного назначения...