Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Динамические массивы объектов




Динамические объекты

Для создания динамического объекта (как и для других данных встроенных типов) используют операцию new и указатель на объект.

Операция new выделяет память для объекта в специальной области памяти, называемой кучей, и вызывает конструктор. В качестве операнда выступает название типа, а результатом является адрес выделенной памяти. Например, так будет создан новый динамический объект типа Samp, на который указывает указатель p:

Samp * p; p = new Samp; или Samp * p = new Samp;

 

Созданный таким образом объект существует до тех пор, пока память не будет явно освобождена с помощью операции delete, которую можно поместить в деструкторе. В качестве операнда должен быть задан адрес, возвращённый операцией new (указатель p):

delete p;

Если свободной памяти для создания нового объекта недостаточно, операция new возвращает нулевой указатель (p = NULL). Поэтому программа должна всегда проверять успешность создания динамического объекта:

if(!p){cout<<"Error: no memory"<<endl; exit(1);}

C++ позволяет при создании динамических объектов инициализировать их аналогично переменных любых других типов:

Samp * p = new Samp(5, 6); // x = 5 y = 6

Объекты, созданные с помощью операции new, называются динамическими объектами, потому что они создаются и уничтожаются в процессе работы программы. Динамические объекты размещаются в специальной области памяти – куче). Для доступа к элементам объекта применяется операция стрелка (->).

Динамический массив объектов – это массив, для которого выделяется память и определяется его размер во время выполнения программы.

Динамический массив объектов создаётся с помощью операции new и указателя. В качестве операнда операции выступает название типа (имя класса) и размер массива, заданный в квадратных скобках после типа, а результатом выполнения операции является адрес начала выделенной памяти под массив объектов:

Samp *p = new Samp[размер массива];

 

Размер массива в операции new может быть переменной, значение которой может быть вычислено в ходе выполнения программы. Адрес начала массива хранится в указателе p. Если памяти недостаточно, то операция new возвращает значение NULL. Поэтому программа должна всегда проверять успешность создания динамического массива объектов (аналогично, как это делали для динамических объектов). После завершения использования массива объектов имеет смысл освободить память, выделенную под массив объектов, с помощью операции delete:

delete [] p;

Доступ к элементам динамического массива осуществляется так же, как и к элементам обычного массива.

Из-за ряда чисто технических причин невозможно явно инициализировать динамические массивы. Поэтому, если в классе есть конструктор с инициализацией, то необходимо перегрузить конструктор под версию без инициализации (т.е. создать конструктор по умолчанию). В противном случае возникает ошибка компиляции.

// Пример 13.4. Создание динамического объекта, массива объектов.

// Перегрузка конструктора для поддержки динамического массива объектов.

#include <iostream>

using namespace std;

class Samp{ // класс Samp

int x;

public:

Samp(){x = 0;} // конструктор по умолчанию

Samp(int n){x = n;} // конструктор с параметром

void set(int m){x = m;} // функция установки x

int get(){return x;} // функция чтения x

};

int main(){

Samp * q = new Samp(5); // создание динам. объекта

cout<<q->get()<<endl; // 5

int size; // size – размер динам. массива

cout<<"Vvedi size: "; cin>>size;

Samp * p = new Samp[size]; // создание динам. массива объектов

if(!p){cout<<"No memory"<<endl; exit(1);}

for(int i = 0; i < size; i++){ // инициализация массива

p->set(i); // вариант 1

p++;

}

// for(int i = 0; i < size; i++) // вариант 2

// p[i].set(i*2);

// for(int i = 0; i < size; i++) // вариант 3

// (p+i)->set(i*3);

// for(int i = 0; i < size; i++) // вариант 4

// (*(p+i)).set(i*4);

for(int i = 0; i < size; i++) // этот цикл нужен

p--; // только для варианта 1!!!!

cout<<"Massiv=="<<endl; // вывод динам. массива

for(int i = 0; i < size; i++)

cout<<p[i].get()<<' ';

cout<<endl;

delete [] p;

system("pause");

}




Поделиться с друзьями:


Дата добавления: 2015-06-25; Просмотров: 617; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.018 сек.