
- •6Vpj7-h3cxh-hbtpt-x4t74-3yvy7
- •Оглавление
- •Предисловие
- •Введение
- •1.1. Понятие класса и объекта. Инкапсуляция
- •1.2. Определение классов. Компоненты. Доступность
- •Class_key /*class_id*/ { /*members_list*/ };
- •Value_type class_id::function_id(parameters) {statements}
- •CPoint point1(100,70); // локальный объект
- •Static cPoint point3(50,120); // статический объект
- •Class_id(parameters) /*:initializer_list*/ {/*statements*/}
- •CString(const char *);
- •Delete[] __thematrix;
- •1.4. Обращение к компонентам объектов
- •1.5. Статические и нестатические компоненты классов
- •1.7. Указатель this
- •В опросы для самопроверки
- •2. Механизм наследования. Полиморфизм
- •2.1. Формы наследования. Базовые и производные классы
- •Class_key class_id: inheritance_specifier base_class_id {member_list};
- •2.3. Абстрактные классы
- •2.4. Множественное наследование и виртуальные классы
- •2.5. Преобразование динамических типов. Динамическая идентификация типов
- •Catch ( std::bad_cast & ) { // обработка исключения
- •Return 0;
- •Вопросы для самопроверки
- •3. Дружественные функции и классы
- •3.1. Дружественные функции
- •3.2. Дружественные классы
- •Вопросы для самопроверки
- •4. Механизм вложения
- •4.1. Вложенные классы
- •4.2. Локальные классы
- •Вопросы для самопроверки
- •5. Объектная модель и шаблоны
- •5.1. Определение, описание и инстанцирование шаблонов
- •::Function_id(function_parameter_list) { statements }
- •5.2. Параметры и аргументы шаблонов
- •Class identifier typename identifier
- •// Key, Data – параметры-типы (типы ключа и данных отображения)
- •// Container – контейнер, где содержится информация отображения class сMap {
- •Class MyTemplate
- •Int array[10]; struct Structure { int m; static int sm; } str;
- •5.3. Шаблоны компонентных функций
- •Value_type function_template_id(function_parameter_list) { statements }
- •::Function_template_id(function_parameter_list) { statements }
- •5.4. Специализация шаблонов
- •Вопросы для самопроверки
- •6. Перегрузка операций
- •Value_type operator @ (parameter_list);
- •Value_type operator @ (parameter_list) { statements }
- •Return fail();
- •6.3. Перегрузка бинарных операций
- •Value_type operator @ (parameter); // компонентная функция
- •Value_type operator @ (parameter, parameter); // глобальная функция friend value_type operator @ (parameter, parameter); // дружественная функция
- •Return *this;
- •Return *this;
- •/* Присваиваем собственные данные класса d */
- •6.4. Перегрузка операций управления памятью
- •Typedef void (*new_handler) ();
- •Extern new_handler set_new_handler( new_handler new_p );
- •Void operator delete(void * memory) {
- •... // Специальная обработка пользователя ::operator delete(memory); // освободить память
- •Вопросы для самопроверки
- •7. Механизм исключений
- •Throw expression
- •7.3. Специальные средства поддержки механизма исключений
- •Unexpected_function set_unexpected(unexpected_function func_name);
- •Typedef void (* unexpected_function) ();
- •Extern char * __throwExceptionName; extern char * __throwFileName; extern unsigned __throwLineNumber;
- •Вопросы для самопроверки
- •8. Подсчет ссылок
- •8.1. Назначение механизма подсчета ссылок
- •8.2. Контекстно-независимая модель счетчика ссылок
- •8.4. Внедрение подсчета ссылок в существующий класс
- •Вопросы для самопроверки
- •9. Стандартная библиотека шаблонов (stl)
- •9.1. Назначение и архитектура stl
- •9.2. Последовательные контейнеры
- •Class vector {
- •// Определение итераторов
- •Sort(first,last); // сортировка вектора в диапазоне итераторов
- •Ifstream ifile ("example.In"); ofstream ofile ("example.Out");
- •OutputIterator copy(
- •InputIterator first, InputIterator last, OutputIterator result );
- •// Заполнение списка
- •Operator- (int)
- •Operator- (random access iterator) operator[] (int)
- •InputIterator find(InputIterator first, InputIterator last, const t & value);
- •InputIterator find(InputIterator first, InputIterator last, const t & value)
- •Return first;
- •OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
- •Return result;
- •OutputIterator transform (InputIterator first, InputIterator last, OutputIterator result, UnaryOperation op)
- •Return result;
- •Void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp)
- •__Quick_sort_loop(first, last, comp); __final_insertion_sort(first, last, comp);
- •T accumulate(InputIterator first, InputIterator last, t init, Function f);
- •V.Push_back(2); V.Push_back(5);
- •9.5. Функторы
- •T operator()(const t & X) const { return -X; }
- •9.7. Адаптеры
- •S1.Push(1); s1.Push(5);
- •// Записать в вектор числа 1 2 3 4
- •// Сортировать по неубыванию
- •// Записать в вектор числа 4 6 10 3 13 2
- •Вопросы для самопроверки
- •Заключение
- •Библиографический Список
- •6Vpj7-h3cxh-hbtpt-x4t74-3yvy7
Предисловие
В учебном пособии излагаются основы объектно-ориентированной разработки программ на языке С++. Пособие может использоваться при проведении лекций, лабораторных и практических занятий, а также в рамках самостоятельной работы студентов. Использование пособия предполагает, что читатели хорошо знакомы с языком С – предшественником языка С++, имеют представление об объектно-ориентированном проектировании программ и обладают базовыми навыками работы в интегрированных средах разработки приложений.
Пособие предназначено для студентов, обучающихся по специальностям 220100, 220400 и 220500, и может быть полезно аспирантам, магистрантам и специалистам, использующим язык С++ для решения широкого круга прикладных задач.
В отличие от существующих изданий по С++, которые, как правило, охватывают все концепции языка С++, данное пособие затрагивает только средства объектно-ориентированного программирования, являющиеся наиболее сложной для изучения частью языка. Это позволяет подробнее остановиться на всех конструкциях объектно-ориентированного программирования С++, рассмотреть большее число примеров по каждой теме, коснуться вопросов эффективности конструкций, которые часто упускают из вида.
Пособие организовано в виде серии глав, каждая из которых посвящена отдельной концепции объектно-ориентированного программирования на С++. В конце каждой главы дается перечень вопросов для самопроверки, а также список задач. Вопросы делятся на две категории: теоретические и практические, что способствует как закреплению знаний, так и приобретению практических навыков. Желательно, чтобы все практические вопросы и задачи проверялись на ЭВМ.
Главы 1-4, 6-8 написаны И.В.Зотовым, а главы 5 и 9 – Ширабакиной Т.А.
Авторы выражают искреннюю признательность рецензентам профессору Лопину В.Н. и доценту Жмакину А.П. за детальное изучение рукописи и ценные замечания, которые позволили улучшить содержание пособия. Также авторы благодарны сотрудникам редакционно-издательского отдела Курского государственного технического университета за нелегкий труд, связанный с редактированием рукописи.
Введение
Язык С++ представляет собой строгое надмножество языка С и является в настоящий момент одним из наиболее распространенных языков программирования высокого уровня. Область его применения весьма широка: от написания несложных программ расчетного характера до разработки компиляторов, СУБД и операционных систем. С++ поддерживает такие традиционные технологии программирования, как структурное и модульное программирование, а также содержит широкий набор конструкций для поддержки объектно-ориентированного программирования.
С++ дает программисту возможность написания гибких и эффективных программ, что является его несомненным достоинством. Однако, С++ весьма сложен для освоения; в особенности, это касается объектно-ориентированной части языка. Указанная сложность обусловлена целым рядом факторов, в частности, большим числом синтаксических конструкций (например, одних только операций в С++ более чем в 2 раза больше, чем в языке Object Pascal), глубокой контекстной зависимостью многих элементов (к примеру, один и тот же символ согласно контексту может обозначать унарную операцию, бинарную операцию или быть разделителем), а также рекурсивным определением языка. Для С++ характерны чрезвычайно сложная система правил автоматического приведения типов, нетривиальный порядок разбора выражений и деклараций.
Язык С++ в настоящее время стандартизован; его полное описание содержится в международном стандарте [8]. Это несомненный плюс для тех, кто использует язык С++. Однако, изучение языка по стандарту доступно лишь профессионалам; для остальных более разумный выход – использование учебных пособий. Несмотря на то, что в последние годы вышло большое число учебников и пособий по С++ на русском языке, потребность в продолжении издания по-прежнему высока. Это обусловлено, с одной стороны, тем, что существующие пособия ориентируются на устаревшие среды программирования, которые не полностью соответствуют стандарту С++ (в частности, Borland C++ 3.x). С другой стороны, в них, как правило, недостаточно глубоко затрагиваются вопросы эффективности. Те же издания, где вопросы эффективного программирования все же находят отражение, страдают недостаточной структурированностью материала.
При формировании данного учебного пособия ставилась цель преодолеть приведенные выше недостатки существующих изданий. В нем рассматривается стандартный С++ в соответствии с [8]; в качестве среды программирования используется относительно новая Borland C++ Builder 5.0. Каждая глава завершается списком вопросов для самопроверки, включающим как традиционные вопросы, связанные с определением конструкций, так и вопросы «на смекалку». В рамках каждой темы обязательно проводится анализ эффективности тех или иных программных решений, приводятся опасные и неоднозначные конструкции, которых следует избегать на практике. В целях усиления практических навыков читателю предлагается для решения несколько задач по каждой теме. Задачи выбраны так, чтобы в них максимально использовался материал соответствующей главы, при этом обучаемому дается «пространство» для проявления творческих способностей.
1. Объектная модель С++. Классы и объекты