Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 2
Текст из файла (страница 2)
Однако преимущества программирования на C++ с лихвой окупятваши усилия.Целью этой главы должно стать знакомство с некоторыми наиболее важными свойствами C++. Как вы знаете, элементы языка программирования несуществуют в пустоте, изолированно от других.
Они работают вместе в видеполной, законченной конструкции. В C++ эта взаимозависимость еще более ярко выражена, чем в С. В результате, трудно обсуждать любой аспектC++ без других его аспектов. Поэтому первая глава посвящена предварительному знакомству с теми свойствами C++, без которых сложно понятьприводимые здесь примеры программ.
Более подробно эти свойства будутизучаться в следующих главах.Эта глава также освещает некоторые отличия между стилями программирования на языках С и C++. В C++ имеется несколько возможностей длянаписания более гибких, чем в С, программ. Хотя некоторые из этих возможностей имеют очень слабую связь с объектно-ориентированным программированием, или вообще ее не имеют, тем не менее, поскольку они содержатся в большинстве программ C++, стоит обсудить их в первую очередь.Поскольку C++ был задуман для поддержки объектно-ориентированногопрограммирования, эта глава начинается с описания OOP.
Как вы увидите,многие свойства C++ тем или иным образом касаются OOP. Однако важнопонимать, что C++ может использоваться для написания не только объектно-ориентированных программ. То, как вы используете C++, полностьюзависит от вас.К моменту написания этой книги процесс стандартизации языка программирования C++ был завершен. По этой причине здесь описываются неко-10_СамоучительC++торые важные отличия между обычными для последних нескольких лет версиями C++ и новым стандартом языка (Standard C++). Поскольку настоящая книга задумывалась как пособие для обучения языку Standard C++,этот материал особенно важен для тех, кто работает с устаревшим компилятором.Помимо знакомства с некоторыми важными свойствами C++, в этой главеописываются существующие отличия между стилями программирования С иC++.
Есть несколько аспектов C++, которые позволяют писать программыс большей гибкостью. Некоторые из этих аспектов C++ имеют очень незначительную связь с объектно-ориентированным программированием или вообще ее не имеют, но поскольку они встречаются в большинстве программна C++, стоит обсудить их в начале книги.Перед тем как начать собственно изложение материала, имеет смысл сделать несколько важных замечаний о природе и форме C++. Как правило,программы на C++ внешне напоминают программы на С. Так же, как и наС, программы на C++ начинают выполняться с функции mainQ. Для получения аргументов командной строки C++ использует те же параметры argc,argv, что и С.
Хотя C++ определяет их в собственной объектноориентированной библиотеке, он также поддерживает все функции стандартной библиотеки С. В C++ используются те же управляющие структурыи те же встроенные типы данных, что и в С.Запомните, в этой книге предполагается, что вы уже знаете язык программирования С.
Проще говоря, вы уже должны уметь программировать на Сперед тем, как начнете изучать программирование на C++. Если вы еще незнаете С, то желательно потратить некоторое время на его изучение.В этой книге предполагается, что вы знаете, как компилировать и выполнятьпрограмму, используя компилятор C++. Если это не так, вам следует обратиться к соответствующему руководству пользователя. (Из-за отличий в компиляторах дать в этой книге инструкцию для работы с любым из них непредставляется возможным.) Поскольку программирование лучше изучать вработе, вам настоятельно рекомендуется вводить, компилировать и запускать приводимые в книге примеры программ в том порядке, в котором онипредставлены.1.1.
Что такое объектно-ориентированноепрограммирование?Объектно -ориентире ванное программирование — это новый подход к созданию программ. По мере развития вычислительной техники возникалиразные методики программирования. На каждом этапе создавался новыйподход, который помогал программистам справляться с растущим усложне-Глава 1. Краткий обзор C++Г/_нием программ. Первые программы создавались посредством ключевых переключателей на передней панели компьютера. Очевидно, что такой способподходит только для очень небольших программ. Затем был изобретен языкассемблера, который позволял писать более длинные программы. Следующий шаг был сделан в 1950 году, когда был создан первый язык высокогоуровня Фортран.Используя язык высокого уровня, программисты могли писать программыдо нескольких тысяч строк длиной.
Для того времени указанный подход кпрограммированию был наиболее перспективным. Однако язык программирования, легко понимаемый в коротких программах, когда дело касалосьбольших программ, становился нечитабельным (и неуправляемым). Избавление от таких неструктурированных программ пришло после изобретения в1960 году языков структурного программирования (structured programming language).
К ним относятся языки Алгол, Паскаль и С. Структурное программирование подразумевает точно обозначенные управляющие структуры,программные блоки, отсутствие (или, по крайней мере, минимальное использование) инструкций GOTO, автономные подпрограммы, в которыхподдерживается рекурсия и локальные переменные. Сутью структурногопрограммирования является возможность разбиения программы на составляющие ее элементы. Используя структурное программирование, среднийпрограммист может создавать и поддерживать программы свыше 50 000строк длиной.Хотя структурное программирование, при его использовании для написанияумеренно сложных программ, принесло выдающиеся результаты, даже онооказывалось несостоятельным тогда, когда программа достигала определенной длины.
Чтобы написать более сложную программу, необходим был новый подход к программированию. В итоге были разработаны принципыобъектно-ориентированного программирования. OOP аккумулирует лучшиеидеи, воплощенные в структурном программировании, и сочетает их смощными новыми концепциями, которые позволяют оптимально организовывать ваши программы.
Объектно-ориентированное программированиепозволяет вам разложить проблему на составные части. Каждая составляющая становится самостоятельным объектом, содержащим свои собственныекоды и данные, которые относятся к этому объекту. В этом случае вся процедура в целом упрощается, и программист получает возможность оперировать с гораздо большими по объему программами.Все языки OOP, включая C++, основаны на трех основополагающих концепциях, называемых инкапсуляцией, полиморфизмом и наследованием.Рассмотрим эти концепции.ИнкапсуляцияИнкапсуляция (encapsulation) — это механизм, который объединяет данные икод, манипулирующий с этими данными, а также защищает и то, и другоеот внешнего вмешательства или неправильного использования.
В объектно-12Самоучитель C++ориентированном программировании код и данные могут быть объединенывместе; в этом случае говорят, что создается так называемый "черныйящик". Когда коды и данные объединяются таким способом, создается объект (object). Другими словами, объект — это то, что поддерживает инкапсуляцию.Внутри объекта коды и данные могут быть закрытыми (private) для этогообъекта или открытыми (public). Закрытые коды или данные доступны только для других частей этого объекта.
Таким образом, закрытые коды и данныенедоступны для тех частей программы, которые существуют вне объекта.Если коды и данные являются открытыми, то, несмотря на то, что они заданы внутри объекта, они доступны и для других частей программы. Характерной является ситуация, когда открытая часть объекта используется для того,чтобы обеспечить контролируемый интерфейс закрытых элементов объекта.На самом деле объект является переменной определенного пользователемтипа. Может показаться странным, что объект, который объединяет коды иданные, можно рассматривать как переменную. Однако применительно кобъектно-ориентированному программированию это именно так. Каждыйэлемент данных такого типа является составной переменной.ПолиморфизмПолиморфизм (polymorphism) (от греческого polymorphos) — это свойство, которое позволяет одно и то же имя использовать для решения двух или болеесхожих, но технически разных задач.
Целью полиморфизма, применительнок объектно-ориентированному программированию, является использованиеодного имени для задания общих для класса действий. Выполнение каждогоконкретного действия будет определяться типом данных. Например, дляязыка С, в котором полиморфизм поддерживается недостаточно, нахождение абсолютной величины числа требует трех различных функций: abs(),labs() и fabs(). Эти функции подсчитывают и возвращают абсолютную величину целых, длинных целых и чисел с плавающей точкой соответственно.В C++ каждая из этих функций может быть названа abs(). (Один из способов, который позволяет это делать, показан далее в этой главе.) Тип данных,который используется при вызове функции, определяет, какая конкретнаяверсия функции действительно выполняется. Как вы увидите, в C++ можноиспользовать одно имя функции для множества различных действий.
Этоназывается перегрузкой функций (function overloading).В более общем смысле, концепцией полиморфизма является идея "один интерфейс, множество методов". Это означает, что можно создать общий интерфейс для группы близких по смыслу действий. Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование того же интерфейса для задания единого классадействий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор. Вам, как программисту, не нужно делать этот вы-Глава 1. Краткий обзор C++73бор самому. Нужно только помнить и использовать общий интерфейс.Пример из предыдущего абзаца показывает, как, имея три имени для функции определения абсолютной величины числа вместо одного, обычная задача становится более сложной, чем это действительно необходимо.Полиморфизм может применяться также и к операторам. Фактически вовсех языках программирования ограниченно применяется полиморфизм,например, в арифметических операторах.