Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Технологии программирования





1. Типы данных в языках программирования на примере C++, C#. Упаковка и распаковка объектов.

 

1. Типы данных в языках программирования на примере C++,

Объектно-ориентированное программирование, доминирующее сегодня, построено на классах и объектах. Тем не менее, понятия типа и переменной все еще остаются центральными при описании языков программирования.

Типы данных принято разделять на простые и сложные в зависимости от того, как устроены их данные. У простых (скалярных) типов возможные значения данных едины и неделимы. Сложные типы характеризуются способом структуризации данных, — одно значение сложного типа состоит из множества значений данных, организующих сложный тип.

Есть и другие критерии классификации типов. Так, типы разделяются на встроенные типы и типы, определенныепользователем. Встроенные типы изначально принадлежат языку программирования и составляют его базис. В основе системы типов любого языка программирования всегда лежит базисная система типов, встроенных в язык. На основе встроенных типов программист может строить собственные, им определенные типы данных. Но способы (правила) создания таких типов являются базисными, встроенными в язык.

Типы данных разделяются также на статические и динамические типы. Для данных статического типа память отводится в момент объявления, требуемый размер данных известен при их объявлении. Для данных динамического типа размер данных в момент объявления обычно не известен и память им выделяется динамически по запросу в процессе выполнения программы.

Еще одна важная классификация типов – это их деление на значимые и ссылочные типы. Для значимых типов значение переменной (объекта) является неотъемлемой собственностью переменной (точнее собственностью является память, отводимая значению, а само значение может изменяться). Для ссылочных типов значением является ссылка на некоторый объект в памяти, расположенный обычно в динамической памяти – куче. Объект, на который указывает ссылка, может быть разделяемым. Это означает, что несколько ссылочных переменных могут указывать на один и тот же объект и разделять его значения. Значимый тип принято называть развернутым, подчеркивая тем самым, что значение объекта развернуто непосредственно в памяти, отводимой объекту.

Поскольку язык C# является непосредственным потомком языка C++, то и системы типов этих двух языков близки и совпадают вплоть до названия типов и областей их определения, но есть и отличия.

Язык С++ — строго типизированный язык программирования. Тип определяет количество памяти, необходимое для хранения данных, диапазон допустимых значений и операции, осуществляемые с этим типом данных.

Стандарт языка C++ включает следующий набор фундаментальных типов:

1. Логический тип (bool).

2. Символьный тип (char).

3. Целые типы. Целые типы могут быть одного из трех размеров – short, int, long, сопровождаемые описателем signed или unsigned, указывающим, на то, как интерпретируется значение, – со знаком или без оного.

4. Типы с плавающей точкой. Эти типы также могут быть одного из трех размеров – float, double, long double.

Кроме того, в языке есть:

5. Тип void, используемый для указания на отсутствие информации.

Язык позволяет конструировать типы:

6. Указатели (например, int* – типизированный указатель на переменную типа int).

7. Ссылки (например, double& – типизированная ссылка на переменную типа double).

8. Массивы (например, char[] – массив элементов типа char).

Язык позволяет конструировать пользовательские типы:

9. Перечислимые типы (enum) для представления значений из конкретного множества.

10. Структуры (struct) - применяются для группирования (объединения) данных. В отличие от массива, в структуру можно объединять различные типы данных.

11. Классы - разновидность абстрактного типа данных, характеризуемый способом своего построения. Наряду с понятием «объекта» класс является ключевым понятием в ООП. Суть отличия классов от других абстрактных типов данных состоит в том, что при задании типа данных класс определяет одновременно и интерфейс (перечень возможных вычислений, которые может выполнить та или иная часть программы, описание того, какие аргументы и в каком порядке требуется передавать на вход алгоритмам, и что и в каком виде они будут возвращать), и реализацию для всех своих экземпляров, а вызов метода-конструктора обязателен.

Первые три вида типов называются интегральными или счетными. Значения этих типов перечислимы и упорядочены. Целые типы и типы с плавающей точкой относятся к арифметическомутипу.


 

2. Типы данных в языках программирования на примере C#

Эта схема типов сохранена и в языке C#. В C# применяется унифицированная система типов. Все типы C#, включая простые типы (например, int и double), наследуются от единственного корневого типа object. В C# используется классификация, носящая для C# принципиальный характер. Согласно этой классификации все типы можно разделить на четыре категории:

1. типы-значения (значимый тип) (Целочисленные, типы с плавающей запятой, символы, логический тип) или значимые типы.

2. ссылочные (objects, string).

3. указатели (pointer).

4. тип void.

Эта классификация основана на том, где и как хранятся значения типов. Для ссылочного типа значение задает ссылку на область памяти в «управляемой куче», где расположен соответствующий объект. Для значимого типа используется прямая адресация, значение хранит данные, и память для них отводится, как правило, в стеке. В отдельную категорию выделены указатели, что подчеркивает их особую роль в языке. Указатели имеют ограниченную область действия, и могут использоваться только в небезопасных блоках, помеченных как unsafe. Особый статус имеет и тип void, указывающий на отсутствие какого либо значения.

Библиотека классов платформы.NET Framework определяет набор встроенных числовых типов, а также более сложных типов, представляющих широкое разнообразие логических конструкций, например, файловую систему, сетевые подключения, коллекции и массивы объектов и даты. В языке C# жестко определено, какие типы относятся к ссылочным, а какие к значимым. К значимым типам относятся типы: логический, арифметический, структуры, перечисление. К ссылочным типам относятся массивы, строки и классы. На первый взгляд, такая классификация может вызывать вопрос, почему структуры, которые в C++ близки к классам, относятся к значимым типам, а массивы и строки к ссылочным. Это связано с тем, что в C# массивы рассматриваются как динамические, их размер может определяться на этапе вычислений, а не в момент трансляции. Строки в C# также рассматриваются как динамические переменные, длина которых может изменяться. Поэтому строки и массивы относятся к ссылочным типам, требующим распределения памяти в куче.

Конструкции структура, класс, интерфейс и перечисление используются для создания собственных пользовательских типов. Структуры C# представляют частный случай класса. Объявив свой класс как структуру, программист получает возможность отнести класс к значимым типам. У программиста C# появляется возможность управлять отнесением класса к значимым или ссылочным типам.

3. Упаковка/распаковка

Упаковка-преобразование -представляет собой процесс преобразования типов значений в тип object или любой другой тип интерфейса, реализуемый этим типом значения. Когда тип значения упаковывается средой CLR (общеязыковая исполняющая среда) — среда, интерпретирующая код на языке CIL (промежуточный язык) в байт-код, в который компилируются программы, написанные на.NET-совместимых языках программирования), она создает программу-оболочку значения внутри System.Object и сохраняет ее в управляемой куче (объём памяти, зарезервированный под структуру). Операция распаковки-преобразования извлекает тип значения из объекта.


Упаковка-преобразование является неявной (выполняет компилятор); распаковка-преобразование является явной (выполняет программист).

Некоторые языки, такие как C# или Visual Basic.NET, поддерживают операции упаковки и распаковки прозрачно для программиста. Это, конечно, хорошо, т.к. упрощает программирование, но при недостаточном понимании происходящих "за кадром" процессов это может привести к потере эффективности. Поэтому необходимо вдумчиво подходить к каждому отдельному случаю.

Концепция упаковки и распаковки лежит в основе единой системы типов C#, в которой значение любого типа можно рассматривать как объект.

Упаковка - это процесс копирования объекта значимого типа, расположенного в стеке в соответствующий объект ссылочного типа.

Типичным примером упаковки является приведение объекта значимого типа к типу object или интерфейсу, который реализует этот значимый тип.

Вот типичные примеры:

int i = 0;

object o = i; //здесь происходит упаковка

IConvertible c = i; //здесь также происходит упаковка.

Распаковка - это противоположный процесс, т.е. процесс "копирования" значимого объекта, расположенного в управляемой куче, в переменную значимого типа, расположенную в стеке.

int i2 = (int)o; //распаковка

 

Дисциплины: «Базы данных», «Корпоративные информационные системы», «Проектирование информационных систем»







Date: 2016-06-06; view: 540; Нарушение авторских прав



mydocx.ru - 2015-2024 year. (0.009 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию