|
Программирование >> Дополнительные возможности наследования
Перефузив оператор индексирования ([]), можно превратить связанный список в отсортированную коллекцию. Если добавить функцию отслеживания одинаковых членов, то отсортированная коллекция превратится в набор. Если все объекты списка связать попарно, то связанный список превратится в словарь или в разреженный массив. Рвзюмв Сегодня вы узнали, как создавать массивы в С++. Массив представляет собой коллекцию объектов одинакового типа с фиксированным числом элементов. Массивы никак не конфолируют свой размер. Поэтому вполне возможно в профамме заносить данные за пределы массива, что часто является причиной ошибок. Отсчет индексов массива начинается с 0. Часто допускаемой ошибкой является указание индекса п для массива с размером п. Массивы могут быть одномерными или многомерными. Независимо от размерности, все массивы базовых типов (например, int) или массивы объектов классов с консфук-торами, заданными по умолчанию, могут быть инициализированы при объявлении. Объекты массивов или все массивы целиком можно сохранять как в стековой области памяти, так и в области динамического обмена. Если удаляется объект из области динамической памяти, не забудьте установить квадратные скобки после ключевого слова delete[]. Имена массивов представляют собой константные указатели на первый элемент массива. Чтобы получить доступ к другим элементам, имена массивов можно использовать в математических операциях, как при работе с обычными указателями. Если размер коллекции объектов не известен во время компиляции профаммы, то для поддержания таких коллекций можно использовать связанные списки. Взяв связанный список за основу, можно разработать много других видов массивов и сфук-тур, автоматически выполняющих сложные операции. Строки представляют собой массивы символов. В С++ существуют дополнительные средства манипулирования текстовыми сфоками, включая возможность ввода в массив сфоки, взятой в двойные кавычки. Ввпрвсы U втввты Что произойдет, если в массив из 24-х членов вписать значение для 25-го элемента? Значение будет добавлено в ячейку памяти, не принадлежащую массиву, что может вызвать серьезную ошибку в работе профаммы. Что представляют собой элементы неинициализированного массива? Ячейки памяти, отведенные массиву но не инициализированные, могут содержать любую информацию, ранее сохраненную в этих ячейках. Результат обращения в профамме к элементу массива, который не был инициализирован, не предсказуем. Можно ли создавать комбинации массивов? Да. Массив может содержать указатель на другой, более крупный массив. В случае работы со строками можно использовать некоторые стандартные функции, такие как strcat, чтобы создавать комбинации массивов символов. Чем связанные списки лучше массивов? Массивы всегда имеют фиксированный размер, тогда как размер связанного списка может изменяться динамически во время выполнения профаммы. Всегда ли нужно в классе строк использовать указатель char * для сохранения содер- жимого строки? Нет. Можно использовать любую область памяти, которая больше подходит для решения конкретных задач. Коллоквиум в этом разделе предлагаются вопросы для сатиоконтроля и укрепления полученных знаний и приводится несколько упражнений, которые помогут закрепить ваши практические навыки. Попытайтесь самостоятельно ответить на вопросы теста и вьшолнить задания, а потом сверьте полученные результаты с ответами в приложении Г. Не приступайте к изучению материала следующей главы, если для вас остались неясными хотя бы некоторые из предложенных ниже вопросов. Контрольные вопросы 1. Как обратиться к первому и последнему элементам массива SomeArray[25]? 2. Как объявить многомерный массив? 3. Выполните инициализацию элементов многомерного массива, созданного при ответе на вопрос 2. 4. Сколько элементов содержит массив SomeArray[10][5][20]? 5. Каково максимальное число элементов, которые можно добавить в связанный список? 6. Можно ли в связанном списке использовать индексы? 7. Каким является последний символ в строке Сергей - хороший парень ? Упражнвння 1. Объявите двухмерный массив, который представляет поле для игры в крестики и нолики. 2. Запишите профаммный код, инициализирующий значением о все элементы созданного перед этим массива. 3. Объявите класс узла Node, поддерживающего целые числа. 4. Жучки: что неправильно в следующей профамме? unsigned short SomeArray[5][4]; for (int i = 0; i<4; i++) for (int j = 0; ]<5; ]++) So(rteArray[i][]] = i+j; 5. Жучки: что неправильно в следующей профамме? unsigned short SomeArray[5][4]; for (int i = 0; i<=5; i++) for (int j = 0; j<=4; j++) SomeArray[i][j] = 0; На прошлом занятии вы узнали, как создавать виртуальные функции в производных классах. На этом занятии речь пойдет об основном составляющем ядре полиморфизма - возможности во время выполнения программы связывать специфические объекты производных классов с указателями базового класса. Сегодня вы узнаете: Что такое множественное наследование и как его использовать Что представляет собой виртуальное наследование Что такое абстрактные типы данных Что такое чистые виртуальные функции ПроОйвмы с одиночным носдодованнем Давайте продолжим работу над программой о животных и предположим, что в ней теперь используется два класса, произведенных от какого-то общего класса. Один - Bird, посвященный птицам, а другой - Mammals, посвященный млекопитающим. Класс Bird содержит функцию-член Fly(), задающую возможность полета. Класс Mammals разбит на ряд подклассов, включая класс лошадей - Horse. Класс содержит две функции-члена - WhinnyO и GallopO, объявляющих ржание и бег галопом соответственно. Но внезапно у вас возникает желание создать новый весьма интересный мифический объект - крылатого Пегаса (Pegasus), который был бы чем-то вроде гибрида между Horse и Bird. Сразу предупредим, что, используя только одиночное наследование, вам сложно будет справиться с этой задачей. Если объявить объект Pegasus как член класса Bird, то для него станут недоступными функции WhinnyO и GallopO. Если Pegasus объявить как объект класса Horse, то ему станет недоступной функция Fly(). Первое рещение может состоять в том, чтобы скопировать метод FlyO в класс Horse, после чего в этом классе создать объект Pegasus. При этом оба класса (Bird и Horse) будут содержать один и тот же метод Fly(), и при изменении метода в одном классе нужно будет не забыть внести соответствующие изменения в другом классе. Хорошо, если таких классов будет только два. Если вам придется вносить изменения в программу через некоторое время после ее создания, будет сложно вспомнить, в каких еще классах представлен этот метод. 918452�6
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |