Автор работы: Пользователь скрыл имя, 11 Декабря 2011 в 15:44, курсовая работа
Ключевым понятием C++ является класс. Класс - это тип, определяемый пользователем. Классы обеспечивают скрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операций. C++ предоставляет гораздо лучшие, чем в C, средства выражения модульности программы и проверки типов. В C++ сохранены возможности языка C по работе с основными объектами аппаратного обеспечения (биты, байты, слова, адреса и т.п.). Это позволяет весьма эффективно реализовывать типы, определяемые пользователем.
Введение 3
Теоретические сведения 4
Объектно-ориентированное программирование 4
Обобщенное программирование 8
Библиотека iostream 11
Класс string 14
Наследование 16
Руководство программиста 17
Руководство пользователя 18
Текст задачи 20
Листинг программ 21
Объектно-ориентированное программирование 21
Обобщенное программирование 30
Заключение 35
Используемая литература 36
Существует
заблуждение, что объектно-ориентированное
программирование является чем-то сложным
и непонятным. Но объектная декомпозиция
является ничуть не менее естественной
и интуитивно понятной, чем алгоритмическая,
которая безраздельно властвовала
до появления ООП. В программирование
основные понятия ООП перешли
из других областей знаний, таких как
философия, логика, математика и семиотика,
причем, не претерпев особых изменений,
по крайней мере того, что касается
сути этих понятий. Объектный способ
декомпозиции (представления) является
естественным, и применяется на протяжении
многих веков.
Обобщенное программирование.
Обобщённое программирование — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание. В том или ином виде поддерживается разными языками программирования.
Средства обобщённого программирования реализуются в языках программирования в виде тех или иных синтаксических средств, дающих возможность описывать данные (типы данных) и алгоритмы (процедуры, функции, методы), параметризуемые типами данных. У функции или типа данных явно описываются формальные параметры-типы. Это описание является обобщённым и в исходном виде непосредственно использовано быть не может.
В тех местах программы, где обобщённый тип или функция используется, программист должен явно указать фактический параметр-тип, конкретизирующий описание. Например, обобщённая процедура перестановки местами двух значений может иметь параметр-тип, определяющий тип значений, которые она меняет местами. Когда программисту нужно поменять местами два целых значения, он вызывает процедуру с параметром-типом «целое число» и двумя параметрами — целыми числами, когда две строки — с параметром-типом «строка» и двумя параметрами — строками. В случае, с данными программист может, например, описать обобщённый тип «список» с параметром-типом, определяющим тип хранимых в списке значений. Тогда при описании реальных списков программист должен указать обобщённый тип и параметр-тип, получая, таким образом, любой желаемый список с помощью одного и того же описания.
Компилятор,
встречая обращение к обобщённому
типу или функции, выполняет необходимые
процедуры статического контроля типов,
оценивает возможность заданной
конкретизации и при
Известно
два основных способа реализации
поддержки обобщённого
Порождение нового кода для каждой конкретизации. В этом варианте компилятор рассматривает обобщённое описание как текстовый шаблон для создания вариантов конкретизаций. Когда компилятору требуется новая конкретизация обобщённого типа или процедуры, он создаёт новый экземпляр типа или процедуры, чисто механически добавляя туда тип-параметр. То есть, имея обобщённую функцию перестановки элементов, компилятор, встретив её вызов для целого типа, создаст функцию перестановки целых чисел и подставит в код её вызов, а затем, встретив вызов для строкового типа — создаст функцию перестановки строк, никак не связанную с первой.
Достоинство.
Этот метод обеспечивает максимальное
быстродействие исполнения программы,
поскольку варианты конкретизаций
становятся разными фрагментами
программы, каждый из них может быть
оптимизирован для своего типа-параметра,
к тому же в код не включаются
никакие лишние элементы, связанные
с проверкой или
Недостаток.
Недостатком его является то, что
при активном использовании обобщённых
типов и функций с различными
типами-параметрами размер откомпилированной
программы может очень сильно
возрастать, поскольку даже для тех
фрагментов описания, которые для
разных типов не различаются, компилятор
всё равно генерирует отдельный
код. Этот недостаток можно затушевать
путём частичной генерации
Порождение
кода, который во время исполнения
выполняет преобразование фактических
параметров-типов к одному типу,
с которым фактически и работает.
В этом случае на этапе компиляции
программы компилятор лишь проверяет
соответствие типов и включает в
код команды преобразования конкретного
типа-параметра к общему типу. Код,
определяющий функционирование обобщённого
типа или функции, имеется в откомпилированной
программе в единственном экземпляре,
а преобразования и проверки типов
выполняются динамически, во время
выполнения программы. В этом варианте
порождается, как правило, более
компактный код, но программа оказывается
в среднем медленнее, чем в
первом варианте, из-за необходимости
выполнения дополнительных операций и
меньших возможностей оптимизации.
Кроме того, в компилированный
код для типов-параметров далеко
не всегда включается динамическая информация
о типах (в первом
варианте она есть, если вообще поддерживается,
поскольку конкретизации для каждого
типа-параметра различны), что определяет
некоторые ограничения на применение
обобщённых типов и функций.
Библиотека iostream.
Частью
стандартной библиотеки C++ является
библиотека iostream – объектно-ориентированная
иерархия классов, где используется
и множественное, и виртуальное
наследование. В ней реализована
поддержка для файлового ввода/
Для использования библиотеки iostream в программе необходимо включить заголовочный файл
#include <iostream>
Операции
ввода/вывода выполняются с помощью
классов istream (потоковый ввод) и ostream
(потоковый вывод). Третий класс, iostream,
является производным от них и
поддерживает двунаправленный ввод/вывод.
Для удобства в библиотеке определены
три стандартных объекта-
Вывод осуществляется, как правило, с помощью перегруженного оператора сдвига влево (<<), а ввод – с помощью оператора сдвига вправо (>>).
Потоки для работы с файлами создаются как объекты следующих классов:
Чтобы использовать эти классы, в текст программы необходимо включить дополнительный заголовочный файл <fstream>. После этого в программе можно определять конкретные файловые потоки, соответствующих типов (объекты классов ofstream, ifstream, fstream), например, таким образом:
Работа с файлом обычно предполагает следующие операции:
Классы файловых потоков содержат несколько конструкторов, позволяющие варьировать способы создания потоков. Конструкторы с параметрами создают объект соответствующего класса, открывают файл с указанным именем и связывают файл с объектом. Конструкторы без параметров создают объект соответствующего класса, но не связывают его с файлом.
После
того как файловый поток открыт,
работа с ним чрезвычайно проста:
с входным потоком можно
Создание файлового потока (объекта соответствующего класса) связывает имя потока с выделяемым для него буфером и инициализирует переменные состояния потока. Так как перечисленные классы файловых потоков наследуют свойства класса ios, то и переменные состояния каждого файлового потока наследуются из этого базового класса. Так как файловые классы являются производными от классов ostream (класс ofstream), istream (класс ifstream), stream (класс fstream), то они поддерживают описанный в предыдущих шагах форматированный и бесформатный обмен с файлами. Однако прежде чем выполнить обмен, необходимо открыть соответствующий файл и связать его с файловым потоком.
Открытие файла в самом общем смысле означает процедуру, информирующую систему о тех действиях, которые предполагается выполнять с файлом. Существуют функции стандартной библиотеки языка С для открытия файлов fopen(), open(). Но работая с файловыми потоками библиотеки ввода-вывода языка С++, удобнее пользоваться компонентными функциями соответствующих классов.
Создав
файловый поток, можно "присоединить"
его к конкретному файлу с
помощью компонентной функции open().
Функция open() унаследована каждым из файловых
классов ofstream, ifsream, fstream от класса fstreambase.
С ее помощью можно не только открыть файл,
но и связать его с уже определенным потоком.
Класс string.
С++ не поддерживает встроенный строковый тип. Однако он предоставляет два способа обработки строк. Во-первых, для представления строк можно использовать традиционный символьный массив с завершающим нулем. Во-вторых, можно использовать объекты класса string. Класс string обеспечивают альтернативу для строк с завершающим нулем.
В действительности класс string представляет собой специализацию более общего шаблонного класса basic_ string. Существуют две специализации типа basic_ string: тип string, который поддерживает 8-битовые символьные строки, и тип wstring, который поддерживает строки, образованные двухбайтовыми символами. Чаще всего в обычном программировании используются строковые объекты типа string. Для использования строковых классов С++ необходимо включить в программу заголовок < string >.
Стандартные классы не сразу были добавлены в определение языка С++. При том, сто С++ уже содержит поддержку строк в виде массивов с завершающим нулем. Но строки с завершающим нулем нельзя обрабатывать стандартными С++-операторами, и их нельзя использовать в обычных С++-выражениях. Это лишает «изящества» даже самые элементарные операции со строками. И именно неспособность обрабатывать строки с завершающим нулем привела к разработке стандартного строкового класса. Создавая класс в С++, мы определяем новый тип данных, который можно полностью интегрировать в С++-среду. Это, конечно же, означает, что для нового класса можно перегружать операторы. Следовательно, вводя в язык стандартный строковый класс, мы создаем возможность для обработки строк так же, как и данных любого другого типа, а именно посредством операторов.
Важной причиной создания класса string является безопасность. Руками неопытного пользователя или неосторожного программиста очень легко обеспечить выход за границы массива, который содержит строку с завершающим нулем.
Итак существуют три причины для включения в С++ стандартного класса string:
Использование
нового класса string дает доступ к безопасному
и полностью интегрированному способу
обработки строк. Класс string представляет
собой еще один контейнерный класс, определенный
в С++. Он поддерживает алгоритмы и строки
имеют дополнительные возможности. Класс
string очень большой, он содержит множество
конструкторов и функций-членов. Кроме
того, многие функции-члены имеют несколько
перегруженных форм.