Учебное пособие: Объектно-ориентированное программирование на Borland C++

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

Структура, описывающая точку на плоскости, может быть определена так:

struct Point_struct // ??? ?????????{ int x, y; } // ??????????? ?????? ?????????point1, *ptr_to_point, arpoint [3]; // ?????? ???????????? ????

Члены (компоненты) структуры описываются аналогично данным соответствующего типа и могут быть скалярными данными, указателями, массивами или данными другого структурного типа. Например, для описания структурного типа "прямоугольник со сторонами, параллельными осям координат" можно предложить несколько вариантов:

struct Rect1{Point p1; // ?????????? ?????? ???????? ????Point p2; // ?????????? ??????? ??????? ????};struct Rect2{Point p [ 2 ]; };struct Rect3 {Pointp; // ????? ??????? ????intwidth; // ??????int high; // ?????? ??????????????};

Поскольку при описании членов структуры должны использоваться только ранее определенные имена типов, предусмотрен вариант предварительного объявления структуры, задающий только имя структурного типа. Например, чтобы описать элемент двоичного дерева, содержащий указатели на левую и правую ветви дерева и указатель на некоторую структуру типа Value, содержащую значение данного в узле, можно поступить так:

struct Value;struct Tree_element{Value * val;Tree_element *left, *right;};

Членами структур могут быть так называемые битовые поля, когда в поле памяти переменной целого типа (int или unsigned int) размещается несколько целых данных меньшей длины. Пусть, например, в некоторой програме синтаксического разбора описание лексемы содержит тип лексемы (до шести значений) и порядковый номер лексемы в таблице соответствующего типа (до 2000 значениий). Для представления значения типа лексемы достаточно трех двоичных разрядов (трех бит), а для представления чисел от 0 до 2000 - 11 двоичных разрядов (11 бит). Описание структуры, содержащей сведения о лексеме может выглядеть так:

struct Lexema{unsigned int type_lex : 3;unsigned int num_lex :11;};

Двоеточие с целым числом после имени члена структуры указывает, что это битовое поле, а целое число задает размер поля в битах.

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

Описание объединения строится по той же схеме, что и описание структуры, но вместо ключевого слова struct используется слово union, например, объединение uword позволяет интерпретировать поле памяти либо как unsigned int, либо как массив из двух элементов типа unsigned char.

union uword{unsigned int u;unsigned char b [ 2 ];};

Описания типов, объявляемых программистом, в том числе структур и объединений могут быть достаточно большими, поэтому в Си/Си++ предусмотрена возможность присваивания типам собственных имен (синонимов), достигая при этом повышения наглядности программных текстов. Синоним имени типа вводится с ключевым словом typedef и строится как обычное объявление, но идентификаторы в деклараторах в этом случае интерпретируются как синонимы описанных типов. Синонимы имен типов принято записывать прописными буквами, чтобы отличать их от идентификаторов переменных. Ниже приведено несколько примеров объявления синонимов имен типов.

typedef struct { double re, im } COMPLEX; typedef int *PINT;

После таких объявлений синоним имени может использоваться как спецификатор типа:

COMPLEX ca, *pca; // ?????????? ???? COMPLEX ? ????????? ?? COMPLEXPINT pi; // ????????? ?? int

Приведенное выше описание структур и объединений в основном соответствует их построению в языке Си. В Си++ структуры и объединения являются частными случаями объектных типов данных. Дополнительные сведения об этом будут приведены при рассмотрении объектно-ориентированных средств Си++.

2.4 Операции и выражения

Несмотря на ограниченный набор базовых типов данных (целые и вещественные арифметические данные и строковые литералы) в языке Си++ определен обширный набор операций над данными, часть из которых непосредственно соответствует машинным командам. Как и во всех языках программирования, операции служат для построения выражений. Выражение представляет собой последовательность операндов и знаков операций и служит для вычисления некоторого значения.

В качестве операндов в выражении выступают идентификаторы переменных, константы, и строковые литералы, являющиеся первичными выражениями. Выражение, заключенное в круглые скобки, также рассматривается как первичное. Каждая операция предполагает использование определенных типов операндов (целых, вещественных, указателей). Операция присваивания в Си++ также является выражением, в связи с этим различаются операнды, которым можно присвоить новое значение и операнды, значение которых не может меняться. Чтобы операнду можно было присвоить значение, ему должна соответствовать область памяти и компилятору должен быть известен адрес этой памяти. Такие операнды называют L-выражениями (от английского left -левый), так как они могут быть записаны в левой части оператора присваивания.

Результат вычисления выражения зависит от приоритетов операций. В Си++ сложная система приоритетов операций, включающая 16 уровней. В таблице 2.1 приведен перечень операций Си++ с указанием их приоритетов, назначения и схемы записи.

Таблица 2.1

Приоритет Знак операции Назначение Схема
1 : : Доступ к глобальному имени или имени из другой области : : идентификатор (глобальный)
имя области : : имя_члена_структуры
1 -> Обращение к члену структуры по указателю на структуру указатель -> имя_члена_структуры
1 . Обращение к члену структуры по имени структуры имя_структуры . имя_члена_структуры
1 [ ] Обращение к элементу массива указатель [ индекс ]
1 ( ) Преобразование типа данного имя_типа (выражение ) или (тип) выражение
1 ( ) Вызов функции функция(аргументы)
2 ++ Автоувеличение ++ L-значение или
L-значение++
2 -- Автоуменьшение -- L-значение или
L-значение--
2 ~ Битовое инвертирование ~ целое_выражение
2 ! Логическое отрицание ! выражение
2 - Одноместный минус - выражение
2 + Одноместный плюс + выражение
2 & Получение адреса & L-значение
2 * Разыменование указателя * указатель
2 new Выделение динамической памяти new тип данного
2 delete Освобождение памяти delete указатель
2 delete [] Освобождение памяти для массива delete [] указатель
2 sizeof Размер данного sizeof выражение
2 Размер типа данного sizeof (имя типа )
3 * Умножение выражение * выражение
3 / Деление выражение / выражение
3 % Остаток от деления нацело выражение % выражение
4 ->* Обращение к члену структуры по указателю указатель_на_структуру ->* имя_члена_структуры-указателя
4 .* Обращение к члену структуры по имени структуры имя_структуры .*
имя_члена_структуры-указателя
5 + Сложение выражение + выражение
5 - Вычитание выражение - выражение
6 << Сдвиг влево целое_выражение << целое_выражение
6 >> Сдвиг вправо целое_выражение >> целое_выражение
7 < Меньше выражение < выражение
7 <= Меньше или равно выражение <= выражение
7 > Больше выражение > выражение
7 >= Больше или равно выражение >= выражение
8 == Равно выражение == выражение
8 != Не равно выражение != выражение
9 & Поразрядная конъюнкция выражение & выражение
10 ^ Отрицание равнозначности выражение ^ выражение
11 | Поразрядная дизъюнкция выражение | выражение
12 && Логическое "И" выражение && выражение
13 | | Логическое "ИЛИ" выражение | | выражение
14 ? : Условное выражение выражение ? выражение1 : выражение2
15 = Простое присваивание выражение = выражение
15 @= Составное присваивание, знак @ - один из знаков операций * / % + - << >> & ^ | выражение @= выражение
16 , Операция сле

К-во Просмотров: 252
Бесплатно скачать Учебное пособие: Объектно-ориентированное программирование на Borland C++