Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.doc
Скачиваний:
40
Добавлен:
12.04.2015
Размер:
4.91 Mб
Скачать

Краткая характеристика объектов

Как уже указывалось, лексемы, группируясь и объединяясь вместе, образуют выражения, операторы и другие смысловые конструкции, т.е. конструкции следующей, более высокой ступени иерархии языка. Одним из основных смысловых конструкций языкаC++ является понятие «объект».

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

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

Объявления определения создают объекты, присваивают им имена (идентификаторы), размещают их в оперативной памяти и, при необходимости, их инициализируют. Например:

int i; //создан объект (переменная i), в памяти под него выделено машинное слово.

float x=5.3; //создан объект, выделено 4 байта, инициализирован значением (5.3).

Объявления ссылки не создают объекты, а просто делают их имена известными компилятору (используя ключевое слово extern). Например:

extern int i; // Информирует компилятор о том, что

// объект используется в рассматриваемом файле, а создан он

/ в другом файле.

Объекты могут быть модифицируемыми и немодифицируемыми. Ключевое слово const делает объект немодифицируемым и предотвращает любые ему присваивания и побочные эффекты, такие как инкремент или декремент. Const-указатель на объект не может модифицироваться, однако сам объект может. Например:

const float pi = 3.1415926;

const int max = 32767;

char *const str = "Константный указатель"; // константный указатель

char const *str1 = "Указатель на константу"; // указатель на константу

С учетом этого, следующие операторы являются недопустимыми, например:

pi = 3.0; // присвоение значения константе

i = max++; // инкремент константы

str = "Изменение константного указателя"; // модификация указателя str

Однако вызов функции strcpy (str," Константный указатель ") является допустимым, поскольку он выполняет посимвольное копирование строкового литерала "Константный указатель" в адрес памяти, указываемый str (о функции strcpy () см. в приложении 2, о константах см. в разделе 2).

Имя используется для доступа к объекту. Именем может быть простой идентификатор либо выражение, «указывающее» на адрес объекта.

Идентификатор – это произвольное имя любой длины (см. раздел 2). Стандартные библиотеки C++, а также модули и заголовки файлов, разработанные пользователем, должны иметь уникальные идентификаторы (или формируемые из них выражения) и типы, в этом случае компилятор C++ может однозначно обеспечивать доступ, интерпретировать и модифицировать каждый активный объект разрабатываемой программы.

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

Язык C++ поддерживает многие встроенные (стандартные) и определяемые пользователем типы объектов. Имеется также возможность объявлять указатели на эти объекты. Специальная операция sizeof() позволяет определить во время компиляции размер в байтах любого стандартного или определяемого пользователем типа данных.

Встроенные типы могут быть целочисленными, знаковыми (signed) и беззнаковыми (unsigned), с плавающей и фиксированной точкой (float, double, long double), различной точности. Используемые ключевые слова для определения встроенных (основных) типов объектов представлены в табл. 4.1.

Таблица 4.1 – Ключевые слова для определения встроенных (основных) типов объектов

Целые типы

Плавающие типы

Прочие

char

float

enum

int

double

void

short

long double

near pointer

long

far pointer

signed

unsigned

Для определения объектов целого типа используются различные ключевые слова, которые определяют диапазон значений и размер области памяти, выделяемой под переменные. Ключевое слово char используется для представления символа (из массива символов) или для объявления строковых литералов. Значением объекта типа char является код (размером 1 байт), соответствующий представляемому символу. Для представления символов русского алфавита тип объекта должен быть unsigned char, так как коды русских букв превышают значение 127.

Ключевые слова int, short, long используются для объявления объектов целого типа. Стандарт ANSI C не устанавливает размеры памяти этих типов, за исключением того, что размеры данных short, int и long образуют неубывающую последовательность «short  int  long». Все три типа могут быть одинаковыми. Это существенно для написания мобильных кодов, предназначенных для переноса на другую аппаратную базу.

Всамом деле, размер памяти для переменной типаsigned int определяется длиной машинного слова, которое имеет различный размер на разрядных интерфейсах. Так, на 16-разрядных интерфейсах размер слова равен 2 байта, на 32-разрядных – соответственно 4 байта. То есть тип int эквивалентен типам short int, или long int в зависимости от архитектуры используемой персональной ЭВМ. Таким образом, одна и та же программа может правильно работать на одном компьютере и неправильно на другом. Для определения размера памяти, занимаемой объектом, можно использовать операцию sizeof(), возвращающую значение размера в байтах указанного типа.

Ключевые слова signed и unsigned указывают, как интерпретируется знаковый бит объявляемого объекта, т.е., если указано ключевое слово unsigned, то знаковый бит интерпретируется как часть объекта, в противном случае он интерпретируется как знак. В случае отсутствия ключевого слова unsigned объект целого типа считается знаковым. В том случае, когда типом является signed или unsigned и далее следует идентификатор объекта, то он будет рассматриваться как объект типа int. На рис. 4.2 приведены форматы основных типов для 16 – разрядного интерфейса:

Для объектов, представляющих числа с плавающей точкой используются следующие ключевые слова : float, double, long double(в некоторых реализациях языка Сlong doubleотсутствует).

Тип floatзанимает 4 байта. Из них 1 бит отводится для знака, 8 бит для экспоненты и 23 бита для мантиссы. Старший бит мантиссы всегда равен 1, поэтому он не заполняется, в связи с этим диапазон значений переменной с плавающей точкой приблизительно равен от 3.14E-38 до 3.14E+38.

Тип double занимает 8 байт памяти. Его формат аналогичен формату float. Биты памяти распределяются следующим образом: 1 бит для знака, 11 бит для экспоненты и 52 бита для мантиссы. С учетом опущенного старшего бита мантиссы диапазон значений равен от 1.7E-308 до 1.7E+308.

Объект, который может принимать целое значение из некоторого списка значений, называется объектом перечислимого типа или перечислением. Объявление перечисления начинается с ключевого слова enum и имеет два формата представления: