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


 

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

4714. Основи структурного програмування мовою Python 127.5 KB
  Мета робота Вивчити основи структурного програмування мовою Python, повторити та закріпити матеріал, пройдений у попередніх лабораторних роботах, покращити загальні навички програмування. Короткі теоретичні відомості Присвоювання...
4715. Базові поняття програмування на мові Python 168.5 KB
  Спершу доведеться розібратися з певними базовими поняттями. Не варто їх заучувати – достатньо їх зрозуміти хоча би на інтуїтивному рівні. Згодом, під час практичної роботи, все встане на свої місця. Алгоритми і програми П...
4716. Ознайомлення з основними типами даних в Python 310.5 KB
  Мета роботи Ознайомлення з основними типами даних в Python. Вивчення основ програмування на мові Python. Короткі теоретичні відомості Python - це проста і потужна об’єктно-орієнтована мова програмування високого рівня з чудовими мож...
4717. Обробка послідовностей при програмуванні на мові Python 184.5 KB
  Мета робота Вивчення основ програмування на мові Python. Короткі теоретичні відомості Обробка послідовностей Оператор for Оператор for в Python трохи відрізняється від аналогічного оператора в C або Pascal. Замість незмінного проходження по ...
4718. Вивчення методів доступу до корпусів текстів на мові Python 1004 KB
  Вивчення основ програмування на мові Python. Вивчення методів доступу до корпусів текстів. Вивчення класу ConditionalFreqDist. Виконання лабораторних робіт починаємо з: import nltk from nltk.book import Короткі теорет...
4719. Вивчення методів доступу та роботи з лексичним ресурсами на мові Python 646.5 KB
  Вивчення основ програмування на мові Python. Вивчення методів доступу та роботи з лексичним ресурсами. Семантичний словник англійської мови WordNet. Короткі теоретичні відомості Поняття функції та модуля. При програм...
4720. Використання Юнікоду при обробці текстів на мові Python 852 KB
  Мета робота Вивчення методів роботи з файлами на локальних дисках та з Інтернету. Використання Юнікоду при обробці текстів. Нормалізація текстів, стемінг, лематизація та сегментація. Короткі теоретичні відомості Виконання цієї лабо...
4721. Використання регулярних виразів для обробки текстів 331.5 KB
  Мета робота Використання регулярних виразів для обробки текстів. Короткі теоретичні відомості Виконанні цієї лабораторної роботи необхідно розпочати з регулярних виразів...
4722. Тяговый расчет автомобиля 5.14 MB
  Целью данной курсовой работы является поверочный тяговый расчет автомобиля и конструкторский расчет механизма сцепления. Расчет производятся для автомобиля с заданными параметрами (в качестве учебного задания) или существующего автомобиля...