|
Программирование >> Дополнительные возможности наследования
SonieArray[ SomeArray[ SomeArray[ SoffleArray[ SomeArray[ SomeArray[ SomeArray[ SomeArray[ SomeArray[ SomeArray[ 0][0] 0][1] 1][0] 1][1] 2][0] 2][1] 3][0] 3][1] 4][0] 4][1] В строке 4 объявляется двухмерный массив. Первый ряд содержит пять целочисленных значений, а второй ряд представлен двумя значениями. В ре- зультате создается конструкция из десяти элементов (5x2), как показано на рис. 12.4. Some Array [5] [2] Рис. 12.4. Массив 5x2 Данные вводятся в массив попарно, хотя их можно было записать одной строкой. Затем осуществляется вывод данных с помощью двух вложенных циклов for. Внешний цикл последовательно генерирует индексы первого ряда, а внутренний - индексы второго ряда. В такой последовательности данные выводятся на экран: сначала идет элемент SomeArray[0][0], затем элемент SonieArray[0][1]. Приращение индекса первого ряда происходит после того, как индекс второго ряда становится равным 1, после чего вновь дважды выполняется внутренний цикл. Несколько слов о памяти При объявлении массива компилятору точно указывается, сколько объектов планируется в нем сохранить. Компилятор зарезервирует память для всех объектов массива, даже если далее в профамме они не будут заданы. Если вы заранее точно знаете, сколько элементов должен хранить массив, то никаких проблем не возникнет. Например, шахматная доска всегда имеет только 64 клетки, а от кошки можно ожидать, что она не родит более 10 котят. Если же изначально неизвестно, сколько элементов будет в массиве, то для решения этой проблемы нужно использовать более гибкие средства управления памятью. В этой книге рассматриваются только некоторые дополнительные средства профаммирования, такие как массивы указателей, массивы с резервированием памяти в области динамического обмена и ряд других возможностей. Больше информации о средствах профаммирования, открывающих дополнительные возможности, можно прочитать в моей книге С++ Unleashed, выпушенной издательством Sams Publishing. И вообще, всегда следует помнить, что каким бы хорошим программистом вы ни были, всегда остается то, чему следовало бы научиться, и всегда есть источники, откуда можно почерпнуть новую свежую информацию. Массивы указашвлви Все массивы, рассмотренные нами до сих пор, хранили значения своих элементов в стеках памяти. Использование стековой памяти связано с рядом ограничений, которых можно избежать, если обратиться к более гибкой области динамической памяти. Это можно сделать, если сначала сохранить все объекты массива в области динамической памяти, а затем собрать в массиве указатели на эти объекты. Этот подход значительно сократит потребление профаммой стековой памяти компьютера. В листинге 12.6 показан тот же массив, с которым мы работали в листинге 12.4, но теперь все его объекты сохранены в области динамической памяти. Чтобы показать возросшую эффективность использования памяти программой, в этом примере размер массива был увеличен с 5 до 500 и его название изменено с Litter (помет) на Family (семья). Аистииг 12.6. Сохранение массива в вбиасти дииамическвб иамяши 2 3 4 5 6 7 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 Листинг 12.6. Массив указателей на объекты flinclude <iostream.h> class CAT { public: CATO { ItsAge = 1: itsWeight=5; } CATO { } destructor int GetAgeO const { return itsAge; } int GetWeightO const { return itsWeight; } void SetAge(int age) { itsAge = age; } private: int itsAge; int itsWeight; int mainO { CAT * Family[500]; int i; CAT . pCat; for (1 = 0; 1 < 500; i++) { pCat = new CAT; pCat->SetAge(2.i +1); Family[l] = pCat; for (i = 0; 1 < 500; i++) { cout Cat # i+1 : ; cout << Family[i]->GetAge() endl; return 0; } Cat #1 Cat #2 Cat #3 Cat #499: 997 Cat #500: 999 Объявление класса CAT в строках 5-17 идентично объявлению этого класса в листинге 12.4. Но, в отличие от предыдущего листинга, в строке 21 объявляется массив Family, в котором можно сохранить 500 указателей на объекты класса CAT. В цикле инициализации (строки 24-29) в области динамической памяти создается 500 новых объектов класса CAT, каждому из которых присваивается значение переменной itsAge, равное удвоенному значению индекса плюс один. Таким образом, первому объекту класса CAT присваивается значение 1, второму - 3, третьему - 5 и т.д. В этом же цикле каждому элементу массива присваивается указатель на вновь созданный объект. Поскольку тип массива был объявлен как CAT*, в нем сохраняются именно указатели, а не их разыменованные значения. Следующий цикл (строки 31-35) выводит на экран все значения объектов, на которые делаются ссылки в массиве. Обращение к указателю выполняется с помощью индекса: Family[i]. После того как элемент массива установлен, следует вызов метода GetAgeO. В данном примере программы все элементы массива сохраняются в стековой памяти. Но в этот раз элементами являются указатели, тогда как сами объекты хранятся в области динамического обмена. ООъявление массивов в оОласто динамического оОмена Существует возможность поместить весь массив в область динамического обмена. Для этого используется ключевое слово new и оператор индексирования, как показано в следующем примере, где результатом этой операции является указатель на массив, сохраненный в области динамического обмена: CAT .Family = new САТ[500]; Указатель Family будет содержать адрес в динамической области первого элемента массива из пятисот объектов класса CAT. Другими словами, в указателе представлен адрес объекта Family[0]. Еще одно преимущество подобного объявления массива состоит в том, что в программе с переменной Family теперь можно будет выполнять математические действия как с любым другим указателем, что открывает дополнительные возможности в управлении доступом к элементам массива. Например, можно выполнить следующие действия: CAT .Family = new САТ[500]; CAT .pCat = Family; pCat указывает на Family[0] pCat->SetAge(10); присваивает Family[0] значение 10 pCat++; переход к Family[1] pCat->SetAge(20); присваивает Family[1] значение 20 В данном примере объявляется новый массив из 500 объектов класса CAT и возвращается указатель на первый элемент этого массива. Затем, используя это указатель и метод SetAgeO, объявленный в классе CAT, первому объекту массива присваивается
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |