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


 

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

53597. СРЕДНЕВЕКОВАЯ ДЕРЕВНЯ И ЕЕ ОБИТАТЕЛИ 70 KB
  План урока: Господская земля и крестьянские наделы. Феодалы и зависимые крестьяне. Крестьянская община.
53598. УРОК КАК ОСНОВНАЯ ФОРМА ОРГАНИЗАЦИИ УЧЕБНОЙ РАБОТЫ В ШКОЛЕ План – конспект урока по изобразительному искусству 38 KB
  Виды изобразительного искусства графика живопись скульптура. Виды декоративноприкладного искусства одежда бижутерия ткани обои керамика ковроткачество и т. Виды конструктивного искусства архитектура и дизайн. Отличительные особенности жанров изобразительного искусства пейзаж натюрморт портрет бытовой жанр исторический жанр анималистический жанр.
53599. Геоинформационные системы в интернете 43.5 KB
  Цели урока: Образовательная знакомство с новейшим классом информационных систем освоение приемов поиска и средств навигации в ГИС 2GIS Тюмень и освоение приемов работы с инструментами в программе Google планета Земля. Что такое геоинформационная система ГИС географическая информационная система это современная...
53600. Правописание буквосочетаний жи, ши 785.5 KB
  Цель: Уточнение представлений учащихся о звуках ж, ш, ц как твёрдых; ознакомление учащихся с особенностями написания сочетания жи ши; развитие умение правильно писать сочетания жи ши; развитие познавательной активность детей; речи учащихся наблюдательности внимания мышления умения работать с книгой. Шишка жёлудь цветок Мягкий или твёрдый согласный звук слышится вначале каждого из этих слов Работа с учебником. У доски работают два ученика. Работа с учебником.
53601. Модель оценки капитальных активов 31 KB
  Одним из ключевых положений портфельной теории является обоснование того, что с каждым рисковым активом связаны два типа рисков – диверсифицируемый и недиверсифицируемый
53602. Работа в сети Интернет. Электронная почта 60 KB
  Электронная почта Этапы работы Содержание этапа заполняется педагогом Оценка эксперта по базовым педагогическим компетенциям и уровню владения учебным материалом 1. Методы: беседа Педагог здоровается отмечает отсутствующих в группе. Определение целей и задач которых педагог хочет достичь на данном этапе урока: повторение и закрепление теоретических знаний предыдущего занятия; закрепление практических навыков сохранения информации из интернета стимулирование обучающихся к быстрому выполнению работы воспитание эстетического...
53603. Конспект урока обучение грамоте: «Написание заглавной буквы «Т» 40.5 KB
  Детям предлагается игра Угадай букву по описанию Ставим ручку на верхнюю линию рабочей строки опускаемся по наклонной линии поднимаемся по наклонной до середины выполняем узелок уходим вправовверх и на 1 3 выписываем секрет по секрету наклонная вниз качалочка крючок до середины Ставим ручку на 1 3 сверху уходим влево вверх задерживаемся на строке опускаемся по наклонной вниз выполняем качалочку поднимаемся по крючку до середины две части соединяем секретом по секрету наклонная линия вниз качалочка крючок до середины...
53604. Введение в информатику. Правила техники безопасности 582.5 KB
  Дидактическая цель: дать общее представление об информатике как о науке ввести понятие информатика cформировать знания по технике безопасности работы в компьютерном классе. Знать: формулировку понятия информатика основные правила техники безопасности нормы работы в компьютерном классе основные упражнения физкультминутки. Информатика и ИКТ : учебник для 7 класса Н. Вначале мы узнаем что изучает предмет информатика а также поймем значимость этого предмета в современном мире.
53605. Оценка облигаций 23 KB
  Номинальная цена напечатана на бланке облигации и обозначает сумму, которая берется взаймы и подлежит возврату по истечении срока облигационного займа.