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


 

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

76820. Верхний этаж брюшной полости 180.02 KB
  Брюшина верхнего этажа с диафрагмы переходит на выпуклую диафрагмальную поверхность печени образуя серповидную венечную и треугольные связки которые отграничивают внебрюшинное поле печени прирастающее к диафрагме. В последней в направлении справа налево располагается холедох воротная вена собственная артерия печени. Желудок брюшина покрывает интраперитонеально переходя на него с печени по малому сальнику. Париетальная брюшина в верхнем этаже образует три сумки: печеночную для правой и квадратной долей печени преджелудочную для...
76821. Топография брюшины в среднем и нижнем этажах брюшной полости. Большой сальник. «Карманы» в стенках брюшной полости 185.59 KB
  Париетальная брюшина передней стенки живота образует между пупком и лобком складки и ямки. Ямки надпузырные правая и левая fosse suprvesicles dextr et sinistr между срединной и медиальными пупочными складками. Паховые ямки медиальные правая и левая fosse inguinlis dextr et sinistr между медиальными и латеральными пупочными складками латеральные паховые ямки: правая и левая кнаружи от латеральной складки они соответствуют внутреннему паховому кольцу. Через надпузырные ямки могут возникать скользящие грыжи когда стенкой...
76822. Нос и его полость 182.92 KB
  Корень носа отделяется от лба переносьем в виде пологой поперечной борозды. Различия носа определяются: формой спинки: выпуклая прямая вогнутая; длиной и положением корня носа: глубокое высокое среднее; направлением ноздрей: кверху книзу горизонтально; очертанием верхушки: тупая острая средняя. Скелет носа образован фиброзной тканью хрящами и костями. Фиброзная перепонка находится в передней части перегородки носа покрыта кожей.
76823. Гортань (ларингс) 183.27 KB
  Скелет гортани образуют хрящи и их соединения между собой. Связки и суставы гортани Орган связывает с подъязычной костью щитовидноподъязычная мембрана состоящая из непарной срединной связки и парных боковых – правой и левой. В желудочковой части гортани находятся преддверные и голосовые связки. Эластический конус это фиброзноэластическая мембрана гортани расположенная непосредственно под слизистой оболочкой в нижней части органа т.
76824. Мышцы гортани 181.17 KB
  Гортань лежит на уровне от IV до VIVII шейных позвонков имея спереди и по бокам щитовидную железу поверхностную и трахеальную фасции подподъязычные мышцы; сзади глотку вверху подъязычную кость. Мышцы гортани подразделяются на три группы: расширители дилататоры голосовой щели суживатели констрикторы напряжители тензоры голосовых связок. Мышцырасширители дилататоры.
76825. Трахея и бронхи 184.75 KB
  Она начинается от гортани на уровне VI шейного позвонка заканчивается на уровне IV V грудных позвонков делением на два главных бронха. Приносящие лимфатические сосуды впадают в глубокие шейные лимфатические узлы внутренние яремные а также в трахебронхиальные пред и паратрахеальные узлы. На уровне IVV грудных позвонков трахея образует раздвоение бифуркацию и переходит в правый и левый главные бронхи или иначе обозначая в бронхи первого порядка.
76826. Легкие (пульмо, пневмон) 181.97 KB
  Закладки легких на 6й неделе достигают грудной полости где соматоплевра образует два плевральных мешка и покрывает легкие висцеральным листком. Ритмические сокращения зачатков легких начинаются на 13й неделе эмбрионального развития а с рождением они переходят в дыхательные движения. Сегмент участок доли имеет основание обращенное к поверхностям легких верхушку направленную к корню. Сегментарному строению легких соответствует ветвление бронхиального дерева и легочной артерии.
76827. Корни легких 180.58 KB
  Корень легкого состоит из главного бронха легочной артерии верхней и нижней легочных вен; лимфатических сосудов и узлов нервов переднего и заднего легочного сплетения. Корень располагается в воротах легкого. Они представляют собой овальное углубление на медиальной поверхности легкого которое делит ее на позвоночную и медиастинальную части. В топографии составляющих корня легкого имеется существенное различие.
76828. Плевра - серозная оболочка из соединительнотканной основы покрытой мезотелием 180.66 KB
  Отделы и полость плевры. Границы плевры. Над верхней грудной апертурой выступают правый и левый купола плевры фиксированные связками к первому ребру VII шейному позвонку и длинной мышце шеи. Купола плевры сзади достигают шейки первого ребра а спереди приподнимаются над ребром на 34 см; ключицей на 12 см.