Программирование >>  Дополнительные возможности наследования 

1 ... 111 112 113 [ 114 ] 115 116 117 ... 265


Оператор суммирования возвращает временную строку temp как значение, которое присваивается строке слева от оператора присваивания (stringi). Оператор += манипулирует с уже существующими строками, как в случае stringi += string2. В этом примере оператор += действует так же, как оператор суммирования, но значение временной строки temp присваивается не новой, а текущей строке (*this = temp), как в строке 142.

Функция main О (строки 145-175) выполняется для проверки результатов работы данного класса. В строке 147 создается объект String с помощью конструктора, задающего строки в стиле языка С с концевым нулевым символом. Строка 148 выводит содержимое этого объекта с помощью функции доступа GetString(). В строке 150 создается еще одна строка текста в стиле языка С. В строке 151 тестируется перефужен-ный оператор присваивания, а строка 152 выводит результат.

В строке 154 создается третья строка с концевым нулевым символом - tempTwo. В строке 155 с помощью функции stropyO происходит заполнение буфера строкой символов nice to be here!. В строке 156 с помощью перефуженного оператора += осуществляется конкатенация строки tempTwo к существующей строке si. Результат выводится на экран в строке 158.

В строке 160 возвращается и выводится на экран пятый символ строки - si. Затем в строке 161 этот символ замещается другим с помощью неконстантного оператора индексирования ([]). Результат выводится сфокой 162, чтобы показать, что символ строки действительно изменился.

В строке 164 делается попытка получить доступ к символу за пределами массива. Возвращается и выводится на печать последний символ строки, как и было предусмотрено при перефузке оператора индексирования.

В СфОках 166 и 167 создаются два дополнительных объекта String, и в строке 168 используется перефуженный оператор суммирования. Результат выводится строкой 169.

В строке 171 создается еще один объект класса String - s4. В строке 172 используется оператор присваивания, а сфока 173 выводит результат. Оператор присваивания перефужен таким образом, чтобы использовать константную ссылку класса String, объявленную в строке 21, но в данном случае в функцию передается сфока с концевым нулевым символом. Разве это допустимо?

Хотя компилятор, ожидая получить объект String, вместо этого получает массив символов, он автоматически проверяет возможность преобразования полученного значения в ожидаемую строку. В строке 12 объявляется конструктор, который создает объект String из массива символов. Компилятор создает временный объект String из полученного массива символов и передает его в функцию оператора присваивания. Такой процесс называется неявным преобразованием. Если бы в профамме не бьш объявлен соответствующий конструктор, преобразующий массивы символов, то для этой строки компилятор показал бы сообщение об ощибке.

Связанные списки и другие сшрдкшдры

Массивы являются отличными контейнерами для данных самых разных типов. Единственный их недостаток состоит в том, что при создании массива необходимо задать его фиксированный размер. Если на всякий случай создать слишком большой массив, то попусту будет потрачено много памяти компьютера. Если сэкономить память, то возможности профаммы по оперированию данными окажутся ограниченными.

Один из способов решения этой проблемы состоит в использовании связанных списков. Связанный список представляет собой сфуктуру данных, состоящую из взаимосвязанных блоков, каждый из которых может поддерживать структурную единицу



данных. Идея состоит в том, чтобы создать класс, поддерживающий объекты данных определенного типа, такого как CAT или Rectangle, которые, помимо данных, содержали бы также указатели, связанные с другими объектами этого класса. Таким образом, получается класс, содержащий взаимосвязанные объекты, образующие произвольную структуру-список.

Такие объекты называют узлами. Первый узел в списке образует голову, а последний - хвост.

Существует три основных типа связанных списков. Ниже они перечислены в порядке усложнения.

Однонаправленные списки.

Двунаправленные списки.

Деревья.

В однонаправленных связанных списках каждый узел указывает на следующий узел только в одном направлении. Движение по узлам в обратном направлении невозможно. Чтобы найти нужный узел, следует начать с первого узла и двигаться от узла к узлу, подобно кладоискателю, действующему согласно указаниям карты поиска сокровищ: ...от большого камня иди к старому дубу, сделай три щага на восток и начинай копать... Двунаправленные списки позволяют осуществлять движение в обоих направлениях по цепи. Деревья представляют собой более сложные структуры, в которых один узел может содержать ссылки на два или три следующих узла. Все три типа связанных списков схематично показаны на рис. 12.5.

Общие представления о связанных списках

в данном разделе обсуждаются основные моменты создания сложных структур и, что еще более важно, возможности использования в больших проектах наследования, полиморфизма и инкапсуляции.

Двлвгированив отввшстввнности

Основная идея объектно-ориентированного программирования состоит в том, что каждый объект специализируется в выполнении определенных задач и передает другим объектам ответственность за выполнение тех задач, которые не соответствуют их основному предназначению.

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

Хорошо сконструированная машина состоит из множества деталей с четким распределением функций и структурным взаимодействием между ними, обеспечивающим решение сложных задач. Так же должна выглядеть хорошо написанная профамма: каждый класс вплетает свою нить, а в результате получается шикарный персидский ковер.



Однонаправленный список


Данные

Двунаправленный список

данные


Данные


Данные


Данные

-►0

Дерево

Данные

Данные

Данные

Данные

Данные

Данные

Данные

гхгхгхгл

0 0 0 0 0 0 0

Данные

0 0

Рис. 12.5. Связанные списки

Компоненты связанных сппскпв

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

Обратите внимание, что данные списка и сам список - это не одно и то же. В списке могут быть представлены данные любого типа, но связываются друг с другом не данные, а узлы, которые содержат данные.

Выполняемой части профаммы ничего не известно об узлах, она работает со связанным списком как с единым целым. В то же время функциональная нафузка на список как таковой весьма офаничена - он просто распределяет ответственность за выполнение задач между узлами.



1 ... 111 112 113 [ 114 ] 115 116 117 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика