Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Роль типов данных и их становление ⇐ ПредыдущаяСтр 2 из 2
Параллельным явлением в совершенствовании техники программирования стало развитие концепции типа данных. Это понятие стало одним из ключевых понятий языка программирования в начале 70-х годов. С ним связаны как проблематика новых языков программирования, так и методические аспекты использования средств программирования. Введение этого понятия в программирование обусловлено практикой восприятия действительности человеком. Сталкиваясь в своей жизни и деятельности с объектами различной природы, он привык классифицировать их, объединять в одну группу объекты со сходными признаками и применять к ним одни и те же способы обработки, наиболее им свойственные (например, числа обрабатываются одними операциями, а строки – другими). Ранние языки программирования, такие как Fortran и Algol-60, обеспечивали небольшой набор стандартных типов данных, необходимых для решения математических задач. Коренным образом ситуация изменилась на рубеже 70-х годов, когда применение ЭВМ вышло за рамки математических задач, что потребовало от языков программирования более мощных средств моделирования по сравнению со средствами стандартных типов данных. Поэтому такие языки программирования, как PL-1, Algol-68 и Pascal, были оснащены механизмами конструкторов типов данных, позволяющими определять в программе необходимое количество типов массивов, типов записей, типов множеств, типов файлов и т.п. Типы данных, порождаемые конструкторами типов, обычно называются структурными типами данных. Их использование позволяет упростить работу программиста при отображении структур обрабатываемых данных на структуры, предлагаемые языком программирования и тем самым сократить объем рутинной работы при написании программы. Важно отметить, что при работе со структурными данными конкретного типа данных программист пользуется операциями, предоставляемыми этим типом данных (например, выборка элемента по индексу в массиве или выборка поля по его имени в записи). Тем не менее ограниченное количество конструкторов типов не позволяет адекватно представить в программе любой необходимый тип данных с тем наборам операций, который естественно отражает семантику данного типа данных. Например, оба и тип даты, и тип лица могут быть представлены на Паскале типом записи и тогда программист будет работать с ними, используя операции типа записи. В то же время даты и лица – совершенно разные сущности с совершенно разным поведением (например, можно увеличить дату на единицу, а лицо сочетать браком с другим лицом), учет чего может существенно снизить сложность программы и усилить ее понимаемость. Чтобы дать программисту возможность определять в программе нужные ему типы данных (в дополнение к стандартным и структурным типам данных), в 70-х годах была разработана концепция абстрактных типов данных, обладающих интерфейсом и реализацией. Вся необходимая пользователю информация (имена операций, типы их параметров и типы результатов) сосредотачивалась в доступном ему интерфейсе, а детали реализации типа данных (представление его значений посредством значений известных типов данных и тела операций) были скрыты от него. Реализация типа данных в свою очередь, состоит из представления и тел операций. Интерфейс типа данных предоставляет пользователю информацию об именах и профилях операций. Имя операции – это либо идентификатор, либо – специальный символ (знак). Профиль операции указывает имена типов аргументов и типа результата операции. Если интерфейс типа данных фиксируется автором языка программирования, а реализация – разработчиком компилятора (интерпретатора), то такой тип данных называется встроенным, или стандартным. Если же и интерфейс и реализация создаются программирующим на данном языке, то такой тип данных называется произвольным, или пользовательским. Представление встроенного типа всегда выражается каким-то количеством байтов памяти. Поскольку представление пользовательского типа в конечном итоге может быть выражено в байтах, имеет смысл операция определения размера типа данных. Например, в С++ операция sizeof(T) вырабатывает количество байтов, занимаемых значением типа Т. Как встроенные, так и пользовательские типы данных разделяются, в свою очередь, на конкретные и родовые (параметризованные) типы. Конкретный тип характеризует определенное множество значений, он не требует дальнейшего уточнения и готов к непосредственному использованию. Родовой тип характеризует множество множеств значений, он обладает параметрами и требует конкретизации путем подстановки аргументов. Фактически, родовой тип – это функция высокого уровня (типовая функция), порождающая типы данных с родственными интерфейсами. Другой вариант родового типа данных – это макрос, который в результате макроподстановки превращается в определение конкретного типа данных. По последнему варианту трактуются шаблоны в C++. Этапы ООП. Программа, решающая некоторую задачу, заключает в себе описание части мира, относящегося к этой задаче, или определенной предметной области. Описание действительности в форме взаимодействующих объектов во многих случаях естественнее, чем в форме иерархии подпрограмм, и поэтому оно облегчает программное моделирование такой предметной области. В процессе программирования в объектно-ориентированном стиле можно выделить следующие этапы: 1. Определение основных понятий предметной области и соответствующих им классов с соответствующими свойствами. Обоснование способов создания объектов. 2. Определение или формулирование принципов взаимодействия классов и взаимодействия объектов в рамках программной системы. 3. Установление иерархии взаимосвязи свойств родственных классов. 4. Реализация иерархии классов посредством механизма наследования. 5. Реализация методов каждого класса. В результате такой работы создается объектно-ориентированная среда, или библиотека классов, позволяющая решать задачи моделирования в определенной предметной области. Первые три этапа являются объектно-ориентированным анализом предметной области, а последние два – собственно объектно-ориентированным программированием. 7. Общая характеристика языка С++. С++. Язык был создан Американским ученым Бьярном Строуструпом в первой половине 80-х годов. Задачи: улучшить С поддержать абстракцию данных поддержать объектно-ориентированное программирование обеспечить максимально возможную эффективность работы программ. Улучшение С выразилось в: - контроль типов параметров - операции работы с памятью (динамич. создание и уничтожение объектов) - совмещение имен функций и операций - встраивание функций в код программы. С был взят в качестве базового языка, потому что он: - многоцелевой, лаконичный и относительно низкого уровня - отвечает большинству задач системного программирования - идет везде и на всем - может быть использован в среде программирования UNIX. Абстракция данных есть метод разработки программ с представлением в ней понятий из прикладной области как пользовательских (user-defined) типов данных. Интерфейс типа данных (спецификация) отделяется от его реализации, что - облегчает понимание программ, позволяя прямо описывать понятие в естественных для него терминах - изменять реализацию типа данных, не задевая пользователей. С++ обеспечивает абстракцию данных, поддерживая следующие понятия и возможности: - конструктор пользовательских типов class - средства управления доступом (public, private) - абстрактные классы - гарантированная инициализация и очистка объектов - пользовательские преобразования типов объектов - параметризованные (родовые) функции и типы данных - обработка исключительных ситуаций. Ключевым понятием в С++ является класс. Классы обеспечивают перечисленные выше возможности. ООП основывается на иерархической организации классов подобно тому, как устанавливается иерархия понятий в реальной жизни. В С++ оно поддерживается понятиями: - производный класс (подкласс) - виртуальная функция (подмена функций). C++ — компилируемый статически типизированный язык программирования общего назначения. Поддерживает такие парадигмы программирования как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование, обеспечивает модульность, раздельную компиляцию, обработку исключений, абстракцию данных, объявление типов (классов) объектов, виртуальные функции. Стандартная библиотека включает, в том числе, общеупотребительные контейнеры и алгоритмы. C++ сочетает свойства как высокоуровневых, так инизкоуровневых языков[1]. В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержкеобъектно-ориентированного и обобщённого программирования[2]. C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (игр). Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ. Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler, Embarcadero (Borland) C++ Builder и другие. C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#. Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C; множество программ, которые могут одинаково успешно транслироваться как компиляторами C, так и компиляторами C++, довольно велико, но не включает все возможные программы на C. Заголовочные файлы Одним из простых способов достижения согласованности определений различных файлов является включение в исходные файлы программы заголовочных файлов с интерфейсной информацией. Директива #include " to-be-included" замещает себя содержимым файла " to-be-included", которым должен быть исходный текст на С++. Такое включение обычно делается препроцессором С++. Для включения файлов из стандартного каталога вместо кавычек используются угловые скобки " < " и " > ". Пример: #include < stream.h> // из стандартного каталога #include " myheader.h" // из текущего каталога В заголовочном файле могут содержаться: Определения типов struct point {int x, y; }; Параметризованные типы template < class T> class V; Объявления функций extern int strlen(const char*); Описания встраиваемых функций inline char get() {return *p++}; Объявления данных extern int a; Описания констант const float pi = 3.14.1593; Перечисления enum bool {false, true}; Объявления имен class Matrix; Директивы включения #include < signal/h> Определения макросов #define Case break; case Комментарии /* проверка на конец файла */ Заголовочные файлы обычно имеют суффикс.h, а файлы, содержащие функции или определения данных - суффикс.с или.cpp. 9. Особенности языка с++, не связанные с ООП. Константы, параметры по умолчанию В С++ спецификатор const может использовать для замены директивы #define. Значения объектов, которые объявлены как const не могут быть изменены. Спецификатор const определяет тип константы и позволяет компилятору убедиться, что она используется в контексте, где ее тип не вызовет конфликта. const true=1; const double pl=4*atan(1.); const int size=5000; char *const names=“FFF”; const char *Nam=“GGG”; names - это константный указатель на char, адрес не может быть изменен. Последнее объявление указывает, что строка “GGG” является константой. Указатель Nam не константа и может быть изменен. Единственное отличие констант от переменных, что после инициализации их нельзя изменить. Константы удобны в следующих случаях. Вы хотите улучшить понимание своей программы для других, ведь смысловое имя более понятно чем какое-то число. Если в вашей программе многократно используется некое число, например 7. Но в дальнейшем оно может изменится на другое. То легче один раз объявить константу и когда надо заменить один раз значение у константы. Константы Константные ссылочные типы часто используются в качестве аргументов для функций, чтобы гарантировать не изменность данных.
10. Особенности языка с++, не связанные с ООП. Комментарии, описания, inline-подстановки В С++ комментарии можно вводить одним из двух способов. • Символы /* начинают комментарий, заканчивающийся символами */. Вся эта последовательность символов эквивалентна символу пропуска (например, символу пробела). Символы // начинают комментарий, который заканчивается в конце строки, на которой они появились. Опять, вся последовательность символов эквивалентна пропуску. Символы // можно использовать для того, чтобы закомментировать символы /* или */, а символами /* можно закомментировать //. Если часто повторяется обращение к очень маленькой функции, то вы можете начать беспокоиться о стоимости вызова функции. Обращение к функции члену не дороже обращения к функции не члену с тем же числом параметров (надо помнить, что функция член всегда имеет хотя бы один параметр), и вызовы в функций в C++ примерно столь же эффективны, сколь и в любом языке. Однако для слишком маленьких функций может встать вопрос о накладных расходах на обращение. В этом случае можно рассмотреть возможность спецификации функции как inline-подставляемой. Если вы поступите таким образом, то компилятор сгенерирует для функции соответствующий код в месте ее вызова. Семантика вызова не изменяется. Вы можете указать, что вы хотите, чтобы функция была inline- подставляемой, поставив ключевое слово inline, или, для функции члена, просто включив определение функции в описание класса, как это сделано в предыдущем примере для size() и elem(). При хорошем использовании inline-функции резко повышают скорость выполнения и уменьшают размер объектного кода. Однако, inline- функции запутывают описания и могут замедлить компиляцию, поэтому, если они не необходимы, то их желательно избегать. Чтобы inline-функция давала существенный выигрыш по сравнению с обычной функцией, она должна быть очень маленькой. 11. Особенности языка с++, не связанные с ООП. Ссылки О переменной variableName говорят, что это ссылка на тип. Она определяет местоположение в памяти инициализирующего выражения Init. Ссылка – это псевдоним или альтернативное имя переменной. Ссылку можно считать неизменяемым указателем, который заранее разыменован. Рассмотрим пример: int y=16; int & x=y; printf(“x=%d\n”, x); y=12; printf(“x=%d\n”, x); Результат работы x=16 x=12 Ссылочная переменная x определяет местоположение в памяти переменной y в инициализирующем выражении int & x=y. Переменная x обрабатывается как нормальная переменная типа int. При обращении к такой переменной нет необходимости в операции снятие ссылки. Функциональный эквивалент приведенного выше примера: int y=16; int *x=& y; printf(“x=%d\n”, *x); y=12; printf(“x=%d\n”, *x); Ссылочная переменная должна быть при объявлении инициализирована. Объявление int & x; недопустимо. Ссылки часто используются как формальные параметры в функциях. Это может быть полезно для создания функций, изменяющих полученные параметры.
12. Особенности языка с++, не связанные с ООП. Перегрузка, функции Функция — это определенная группа операций с уникальным именем, которая может: 1. Вызываться по имени в любом месте программы. 2. Получать определенный набор значений из внешней программы в момент вызова. 3. Возвращать в качестве значения некоторый результат заранее заданного типа. Также функцию можно рассматривать как операцию, созданную самим разработчиком. Известный примером функции является main. Она автоматические вызывается при запуске программы. Про перегрузку не нашла
Классы и объекты Классы С++ предлагают расширение предопределенных системных типов. Класс - это определяемый пользователем тип. Каждый класс представляет уникальное множество объектов и операций над ними (методов). Класс предоставляет средства для создания, манипулирования и уничтожения таких объектов. Что представляет собой хороший класс? Нечто, имеющее небольшое и хорошо определенное множество действий. Нечто, что можно рассматривать как " черный ящик", которым манипулируют только посредством этого множества действий. Нечто, чье фактическое представление можно любым мыслимым способом изменить, не повлияв на способ использования множества действий. Нечто, чего можно хотеть иметь больше одного. В общем случае, класс представляется в следующей форме: сlass имя класса { список членов }; Члены класса Членами класса могут быть функции. • Функции-члены - это, функции которые манипулируют данными-членами класса. • Функции-члены имеют доступ ко всем полям своего класса. • Функции-члены могут быть в закрытой, защищенной и открытой части класса. • Функции-члены могут быть определены внутри или вне (С++) объявления класса. Функции-члены, определенные вне класса, могут быть сделаны inline. Функция, описанная внутри класса, является по определению встраиваемой. Синтаксис для реализации метода вне объявления класса: тип_возвращаемого_значения ИмяКласса:: ИмяМетода(Список Аргументов) { Реализация_Метода }; Обратите внимание на еще одно использование оператора разрешения контекста::, который в данном случае сообщает компилятору, что надо воспользоваться областью видимости класса. • Функции-члены могут обращаться к полям или функциям-членам, объявленным после них. • Функции-члены имеют неявно объявленную переменную this. • Функции-члены могут быть static. Такие функции могут непосредственно обращаться и изменять статические поля класса. Статические Функции-члены класса не могут быть объявлены const или virtual. К таким функциям можно обращаться через имя класса, а не через имя конкретного экземпляра объекта. • Функции-члены могут быть объявлены как const, что не позволяет им изменять значение и возвращать неконстантную ссылку или указатель на любое поле класса. Такие Функции-члены не могут быть статическими. 2.2.1.2 Данные члены и управление доступом к элементам классов • Данные-члены - это набор взаимосвязанной информации, возможно различных типов, объединенной в один объект. • Данные-члены могут находиться в закрытой (private), защищенной (protected) или открытой (public) части класса. • Данные-члены могут иметь статический класс памяти (static). Поля, имеющие статический класс памяти, совместно используются всеми объектами класса. К ним возможен доступ через имя класса ( с использованием операции разрешения доступа), а не через контекстный объект класса. Статические поля могут быть инициализированы; если нет, то инициализируется значением ноль. Данные-члены могут быть объявлены как const. Константные данные должны быть инициализированы в каждом определении конструктора. Имена полей и начальные значения заключаются в скобки, отделяются от списка аргументов конструктора двоеточием. Описание класса Описание класса начинается с ключевого слова class. Список членов класса определяет собственные элементы класса. При описании членов классов возможно указание атрибутов управления доступом (модификаторов доступа) к элементам классов. Такими атрибутами являются: • public: члены класса видны извне класса • protected: члены класса видны в производном классе • private: соответствующие элементы могут использоваться только внутри класса По умолчанию элементы класса имеют тип private. Указанный в описании модификатор доступа распространяется на все последующие определения, пока не встретится другой модификатор. Поскольку пользователя часто интересует открытая часть класса, то в описании она обычно располагается первой.
Параметризованные функции Популярное:
|
Последнее изменение этой страницы: 2016-07-14; Просмотров: 468; Нарушение авторского права страницы