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


 

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

18777. Менеджмент благотворительной деятельности 33.38 KB
  Менеджмент благотворительной деятельности. История благотворительности. Нормативно правовое обеспечение. Современные формы и тенденции развития. История благотворительности. Историческая справка об истории благотворительности. Идеи благотворительности нено
18778. Теория и разработка управленческих решений в молодежной организации 36.28 KB
  Теория и разработка управленческих решений в молодежной организации. Молодежные организации их деятельность основывается на следующих принципах: а уважения и реализации прав и свобод человека национальных и общечеловеческих ценностей культурноисторических осо
18779. Лидерство и управление в организации 39.35 KB
  Лидерство и управление в организации. Лидерство это способность формировать коллектив и вести его к намеченным целям на основе личного авторитета. Люди обладающие такой способностью злоупотребляют ею во имя личных интересов. Авторитарная модель подразумевает пол...
18780. Мультипликатор автономных расходов. Эффект мультипликатора и инфляции в общем равновесии 29 KB
  Мультипликатор автономных расходов. Эффект мультипликатора и инфляции в общем равновесии. Мультипликатор автономных расходов отношение изменения равновесного ВНП к изменению любого компонента автономных расходов. Суть эффекта мультипликатора состоит в сле
18781. Теория макроэкономического равновесия в практике управления. Условия частичного равновесия по А.Маршалу и Л.Вальрасу 29 KB
  Теория макроэкономического равновесия в практике управления. Условия частичного равновесия по А.Маршалу и Л.Вальрасу. В самом общем виде равновесие в экономике это сбалансированность и пропорциональность ее основных параметров иначе говоря ситуация когда у уча...
18782. Спрос и предложение на национальном рынке. Экономический смысл показателей: совокупный спрос и совокупное предложение 29 KB
  Спрос и предложение на национальном рынке. Экономический смысл показателей: совокупный спрос и совокупное предложение Цель любой экономической системы достижение макроэкономического равновесия т.е. сбалансированного состояния экономической системы как единого
18783. Сущность совокупного спроса и факторы его определяющие 28 KB
  Сущность совокупного спроса и факторы его определяющие. Совокупный агрегированный спрос от англ. aggregate demand АD это сумма всех индивидуальных спросов на конечные товары и услуги предлагаемые на товарном рынке. Основными формами его проявления служат: потребительск
18784. Совокупное предложение. Совокупное предложение в краткосрочном, среднесрочном и долгосрочном и долгосрочном периоде 33 KB
  Совокупное предложение. Совокупное предложение в краткосрочном среднесрочном и долгосрочном и долгосрочном периоде. Совокупное предложение AS это реальный объем национального продукта который может быть произведен при каждом возможном уровне цен Кривая
18785. Агрегирование показателей совокупного спроса и совокупного предложения как предпосылка осуществления макроэкономического анализа 33 KB
  Агрегирование показателей совокупного спроса и совокупного предложения как предпосылка осуществления макроэкономического анализа. В современной экономической теории макроэкономический анализ равновесия осуществляется при помощи агрегирования или формирования...