Основы программирования в C++
Содержание Введение 1. История развития языков программирования 2. Основы объектно-ориентированного программирования 3. Классы 4. Конструкторы и деструкторы 5. Наследование 6. Указатель this 7. Друзья 8. Перегрузка операций 9. Константные объекты и константные методы Литература Введение Важной вехой в развитии программирования явилось создание и широкое распространение языка С++. Этот язык, сохранив средства ставшего общепризнанным стандартом для написания системных и прикладных программ языка С (процедурно-ориентированный язык), ввел в практику программирования возможности нового технологического подхода к разработке программного обеспечения, получившего название “объектно-ориентированное программирование”. Внедрение в практику программирования объектно-ориентированной парадигмы дает развитие новых областей информатики, значительное повышение уровня технологичности создаваемых программных средств, сокращение затрат на разработку и сопровождение программ, их повторное использование, вовлечение в процесс расширения интеллектуальных возможностей ЭВМ. Объектный подход информационного моделирования предметных областей все более успешно применяется в качестве основы для структуризации их информационных отражений и, в частности, баз знаний. 1. История развития языков программирования Первые компьютеры появились в конце Великой Отечественной Войны сначала в Соединенных Штатах Америки, а позже в СССР. Эти машины могли решать ограниченный класс задач. Кодирование происходило на физическом уровне. Сначала программы хранились на перфокартах. Таким образом, процесс отладки программы занимал очень много времени. Позже появились магнитные ленты и магнитные диски, что облегчило задачу переносимости программ. В конце 1950 - начале 1960 годов появились языки программирования Fortran(FORmula TRANslation) и Cobol(COmmon Business Oriented Language)-язык, ориентированный на выполнение общих экономических расчетов. В 1960-70 годах было написано множество языков программирования. Почти каждый программист придумывал свой язык, мечтая увековечить свое имя. В конце 1970-х появились Паскаль, Модула, Си, которые широко применялись. В начале 1980-х широкое распространение получили персональные компьютеры. Примерно в это же время появился язык C++. Естественно, что C++ более всего близок к языку C. Язык С полностью включен в C++, оставлены все возможности С как языка низкого уровня для выполнения наиболее сложных и универсальных программ. Другим источником вдохновения был язык Simula67; оттуда заимствованы концепции классов и производных классов с виртуальными функциями. Название языка C++ возникло летом 1983 года. Более ранние версии, известные под именем “C с Классами”, используются с 1980 года. Первоначально язык возник в процессе создания программы событийно-управляемой симуляции, для которой идеально подошел бы язык Simula67, если бы не соображения эффективности. “C с Классами” использовался для основных проектов по симуляции только в программах, критичных по времени выполнения и объему используемой памяти. C++ впервые возник вне группы автора в июле 1983года, однако он уже тогда практически не отличался от современной версии языка. Название “C++ “ было предложено Риком Масцитти и символизирует эволюционные изменения, произошедшие с языком C(“++” - обозначение оператора инкрементации в языке C). Таким образом, эволюцию языков можно показать на схеме: Коды Ассемблеры Языки высокого Объектно-ориентированное и уровня модульное программирование 2. Основы объектно-ориентированного программирования: Объектно-ориентированное программирование - это самый высокоуровневый вид программирования в настоящее время. Здесь поддерживаются достижения предыдущих поколений и добавлены новые свойства. Эти новые свойства реализуют парадигму объектно-ориентированного программирования. Объектно-ориентированное программирование на C++ основывается на следующих основных этапах разработки программ. Первый этап заключается в выделении абстракций. Выделение абстракций означает анализ предметной области, для которой составляется программа, с целью определения основных объектов предметной области, их свойств, отношений между объектами, а также возможных операций над объектами и их составляющими. Второй этап состоит в типизации объектов и синтезе абстрактных типов данных. Этап предполагает определение новых производных типов данных и наборов специфических функций или операций, применяемых к этим типам данных таким образом, чтобы исключить возможность смешивания или взаимозамены различных типов. Третий этап заключается в объектной декомпозиции как выделении подтипов или подобъектов и их составляющих для каждого из типов объектов. Четвертый этап представляет собой композиционную иерархизацию объектов как выделение родовидовых и композиционных отношений над объектами. В результате объектно-ориентированного подхода к проектированию программ процесс разработки программы превращается в процесс эволюционного программирования, который для внесения каких-либо изменений и дополнений в программу не требует кардинального пересмотра составляющих ее алгоритмов. Эволюционный способ программирования опирается на сохранение целостности объектов программы, то есть внесение изменений в программу не должно затрагивать внутреннюю организацию существующих в ней объектов. Важным свойством объектно-ориентированных языков является возможность разработки на них программ, работающих в системах со сложными параллельными вычислительными процессами, изначально присущими техническим средствам вычислительной техники. Это свойство опирается на концепцию активных и неактивных объектов в период функционирования программы. Одновременная активность различных объектов становится возможной за счет их строгой типизации и закрытости для изменений другими объектами. Язык программирования C++ обладает всеми основными свойствами языков объектно-ориентированного программирования и существенно отличается по своей концепции от базового языка C. Существует несколько принципов, лежащих в основе языка C++: 1. Инкапсуляция - это объединение производного типа данных с набором функций, используемых при работе с этим типом, в единый класс. При этом функции, включенные в класс, называются методами класса, данные - элементами данных, а конкретные представители класса - объектами класса. Закрытие данных и методов оперирования этими данными происходит таким образом, чтобы обращаться можно было бы только определенным объектам (в данном случае только объектам этих типов). 2. Наследование - это способность одних классов заимствовать основные свойства других классов, в частности - методы классов и элементы данных. Класс, наследующий свойства, называют производным, а класс, предоставляющий свои свойства для наследования, - базовым. Механизм наследования позволяет создавать иерархию классов, то есть многоуровневую систему классов, связанных между собой отношением наследования. 3. Полиморфизм - это возможность определения функции, работающей с различными по типу данных списками параметров в пределах какого-либо одного вида алгоритмов. Такие функции называются обычно виртуальными и проектируются как некоторое семейство одноименных функций, работающих с различными типами данных. Механизм, реализующий выбор какой-либо конкретной функции из определенного семейства, носит название механизма позднего связывания, поскольку может быть использован в процессе выполнения готовой программы. 3. Классы Центральным понятием объектно-ориентированного программирования является понятие класса. Именно он реализует основные свойства: инкапсуляцию, наследование, полиморфизм. Класс представляет собой тип, определяемый пользователем. Этот тип включает в себя совокупность полей данных и функций для работы с этими полями. Класс объявляется: class <имя класса>[: public <имя базового класса>] {поля данных спецификатор доступа функции}; Отнесение переменной к какому-то типу данных определяет память, выделяемую для этой переменной и набор операций и функций, применяемых к таким переменным. Реализация этих принципов для типов, определяемых пользователем, осуществляется при помощи классов. Спецификаторы доступа Существует ряд соображений, по которым было бы целесообразно ограничить доступ к элементам данных класса. К наиболее важным из них относятся следующие: - ограничение доступа к данным класса рамками тех функций, которые включены программистом в этот класс, позволяет локализовать программные ошибки практически до начала работы программы; - описание класса в этом случае позволяет пользователям классов более просто знакомиться с новыми библиотеками классов; - при ограничении доступа упрощается корректировка программ, поскольку для их изменения достаточно скорректировать описание класса и функции, являющиеся его членами, не внося изменений в те места программы, где используются объекты класса; - функциональное разграничение классов делает возможной разработку программ, использующих концепцию параллельных процессов. public Этим спецификатором помечается группа данных и функций, которые доступны другим функциям программы. protected Помечаются защищенные данные и, возможно, функции, если есть необходимость. Эти элементы доступны только функциям - членам данного класса и производных от него классов, то есть тех классов, которые объявят себя приемниками данного. private Служит для задания данных и функций, доступных только функциям данного класса. Это частные данные. По умолчанию элементы считаются частными (private) для класса и открытыми (public) для структуры (объединения также относят к классам). Классы лучше определять в файле с расширением .h, а реализацию в файле с тем же именем, но с расширением .cpp или .c. Чаще всего класс по одиночке не определяется, а создаются библиотеки. Для иллюстрации рассмотрим пример класса, который задает координату на экране: class Location { int x; int y; public: Location (int _x, int _y); //конструктор void setx(int nx); void sety(int ny); int Getx() {return x;} int Gety() {return y;} }; В данном примере, использовав спецификатор public, мы сделали открытыми для других функций методы, описанные в классе. Определить функции - члены класса можно внутри описания класса или за его пределами. В первом случае функция считается встраиваемой. Встраиваемая функция характерна тем, что компилятор C++, обрабатывая вызовы этой функции в программе, заменяет их не на вызов функции как подпрограммы, а непосредственно на объектный код, соответствующий определению этой функции. Вследствие сказанного, программист должен принимать во внимание, что встраиваемые функции, как правило, имеют короткие определения. В качестве примера можно привести определение функций Getx() и Gety(). Для определения функции - члена класса за пределами описания класса необходимо определить ее где-либо в программе после определения класса, членом которого она является. void Location :: setx(int nx) {x=nx;} void Location :: sety(int ny) {y=ny;} Location :: Location (int _x, int _y) {x=_x; y=_y;} Операция разрешения контекста (::) позволяет указать компилятору, к какому из классов принадлежит определяемая функция. Имя класса в определении пишется для того, чтобы компилятор однозначно определил к какому классу принадлежит данная функция, так как функции - члены различных классов могут иметь одинаковые имена. При определении классов не происходит реального выделения памяти под объекты этого класса, а создаются лишь новые производные типы данных, для которых будут использоваться функции - члены класса. Для того, чтобы начать работу с реальными объектами какого-либо класса, эти объекты необходимо сначала определить. При этом в программе необходимо указать имя класса, объект которого должен быть создан, а также имя самого объекта. У каждого из классов может быть произвольное число объектов. 4. Конструкторы и деструкторыКонструктором называется функция-член класса, которая выделяет память под поля данных класса и производит их инициализацию, т.е. задает начальные значения в месте объявления переменных.Имя конструктора совпадает с именем класса. Например, в классе Location конструктор имеет следующий вид: Location (int _x, int _y).Конструктор не возвращает никакого значения, даже void.Одним из важных свойств конструктора является его автоматический вызов при описании любого объекта какого-либо класса, использующего конструктор, что снимает с программиста задачу своевременного отслеживания инициализации вновь вводимых объектов.
Страницы: 1, 2
|