рефераты

рефераты

 
 
рефераты рефераты

Меню

Реферат: Turbo C++ Programer`s guide рефераты

...

(*

int i; char ch; // автоматическое распределение по умолчанию

i = 3;                       // int i и char ch в контексте и видимы

...

(*

double i;

i = 3.0e3;                   // double i в контексте и видима

// int i в контексте, но скрыта

ch = 'A';                    // char ch в контексте и видима

*)

// double i вне контекста

i += 1;                       // int i видима и равна 4

...                        // char ch все еще в контексте и видима

// и равна 'A'

*)

...                        // int i и char ch вне контекста

И снова, специальные правила действуют в отношение скрытых имен классов и имен компонентов классов: специальные операции С++ позволяют доступ к скрытымидентификаторам при определенных условиях (см. стр.103 оригинала).

Продолжительность

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

Статическая продолжительность (static)

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

При отсутствии явного инициализатора, либо вС++ конструктора, объекты со статической продолжительностью инициализируются в ноль (или пустое значение).

Статическую продолжительность не следует путать с файловым или глобальным контекстом. Объектможетиметьстатическую продолжительность и при этом локальный контекст.

Локальная продолжительность (local)

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

Объектыс локальнойпродолжительностью                       жизни,            иначе

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

При объявлении переменных (например, int, char, float) спецификатор класса памяти register такжеподразумевает auto, однако компилятору при этом передается запрос (или рекомендация) о том, что при возможности данный объект желательно разместить в регистре. Turbo C++можно установить таким образом, чтобы он распределял регистрлокальной интегральной переменнойили переменной типа указатель, если какой-либо регистр свободен. Если свободных регистров нет, то переменная распределяется как auto, или динамический локальный объект, без выдачи предупреждения или генерации ошибки.

Динамическая продолжительность (dynamic)

Объекты с динамической продолжительностью жизни создаются и разрушаются конкретными вызовами функций при выполнении программы. Им распределяется памятьиз специального резерва памяти, называемого кучей, при помощи либо стандартных библиотечных функций, какнапример malloc, либо при помощи операции С++ new. Соответствующая отмена распределения выполняется при помощи free или delete.

Единицы трансляции

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

единица-трансляции:

внешнее-объявление

единица-трансляции  внешнее-объявление

внешнее-объявление:

определение-функции

объявление

Слово external имеет в С несколько значений; в данном случае оно относится к объявлениям, находящимся вне каких-либо функций, и которые, следовательно, имеют контекст файла. (Отдельным свойством является внешний тип компоновки; см.следующий раздел, "Компоновка".) Любое объявление, также резервирующее память для объекта или функции, называется определением (или объявлением определения). Более подробную информацию см. в разделе "Внешние объявления и определения" на стр.36 оригинала.

Компоновка

Выполняемая программа обычно создается компиляцией нескольких независимых единиц трансляции, а затем компоновкой получившихся объектных файлов с уже существующими библиотеками. Проблема возникает, когда один и тот же идентификатор объявлен в разных контекстах (например, в различных файлах), либо объявлен более одного раза в одном и том же контексте. Компоновка это процесс, который позволяетправильно связатькаждое вхождение идентификатора с одним конкретным объектом или функцией. Все идентификаторы имеют один из трех атрибутовкомпоновки, тесно связанных с их контекстом: внешняя компоновка, внутренняя компоновка или отсутствие компоновки. Эти атрибуты определяются местоположением и форматом объявлений, а также явным (или неявным по умолчанию) использованием спецификатора класса памяти static или extern.

Каждое вхождение конкретного идентификатора с типом компоновки external представляет тот же самый объект или функцию во всем множестве файлов и библиотек, составляющих программу. Каждое вхождение конкретного идентификатора с типом компоновки internal представляет тот же самый объект или функцию только в пределах одного файла. Идентификаторы с типом компоновки no (отсутствие) представляет уникальные элементы программы.

Ниже приводятсяправила внешней (external) и внутренней (internal) компоновки:

1. Любой идентификатор объекта или файла, имеющий файловый контекст, будет иметь внутренний тип компоновки, если его объявление содержит спецификатор класса памяти static.

Для С, если один и тот же идентификатор в пределах одного файла появляется и с внутренним, и с внешним типом компоновки, то идентификатор будет иметь внутренний тип компоновки.

2. Если объявление идентификатора объекта или функции содержит спецификатор класса памяти extern, то идентификатор имеет тот же тип компоновки, что и видимое объявление идентификатора с файловым контекстом. Если такого видимого объявления не имеется, то идентификатор будет иметь внешний тип компоновки.

3. Если функция объявлена без спецификатора класса памяти, то ее тип компоновки определяется, как если бы был использован спецификатор класса памяти extern.

4. Если идентификатор объекта с файловым контекстом объявлен без спецификатора класса памяти, то идентификатор имеет внешний тип компоновки.

Следующие идентификаторы не имеют атрибута типа компоновки:

1. Любой идентификатор, объявленный иначе, чем объект или функция (например, идентификатор typedef).

2. Параметры функции.

3. Идентификаторы с контекстом блока в случае объектов, объявленных без спецификатора класса памяти extern.

Синтаксис объявления

Все шесть взаимосвязанных атрибута (класс памяти, тип, контекст, видимость,продолжительность и тип компоновки) могут быть разными способами определены при помощи объявлений.

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

Предварительные определения

СтандартANSI C вводит новуюконцепцию: предварительное определение. Любое объявление внешних данных, не имеющее спецификаторакласса памяти и инициализатора, рассматривается как предварительное определение. Еслиобъявленный идентификатор появляется в последующемопределении, то предварительное определение рассматривается,как если бы имелся спецификатор класса памяти extern .Другими словами, предварительное определение становится простым объявлением ссылки.

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

int x;

int x;   /* допустимо, резервируется одна копия x */

int y;

int y = 4;   /* допустимо, y инициализируется значением 4 */

int z = 5;

int z = 6;   /* недопустимо, т.к. оба определения

инициализированы */

Возможные объявления

В число объектов, которые могут быть объявлены, входят:

- переменные

- функции

- классы и компоненты классов (С++)

- типы

- теги структур, объединений и перечислимых данных

- компоненты структур

- компоненты объединений

- массивы прочих типов

- перечислимые константы

- метки операторов

- макросы препроцессора

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

Синтаксис объявлений Turbo C++                              Таблица 1.10

объявление:

<спецификаторы-объявления> <список-деклараторов>

объявление-asm

объявление-функции

спецификация-типа-компоновки

спецификатор-объявления:

спецификатор-класса-памяти

спецификатор-типа

спецификатор-функции

friend (только для С++)

typedef

спецификаторы-объявления:

<спецификаторы-объявления> спецификатор-объявления

спецификатор-класса-памяти:

auto

register

static

extern

спецификатор-функции: (только для С++)

inline

virtual

спецификатор-типа:

имя-простого-типа

спецификатор-класса

спецификатор-перечислимых-данных

спецификатор-усовершенствованного-типа

const

volatile

имя-простого-типа:

имя-класса

имя-typedef

char

short

int

long

signed

unsigned

float

double

void

спецификатор-усовершенствованного-типа:

ключ-класса  идентификатор

ключ-класса  имя-класса

enum имя-перечислимых-данных

ключ-класса: (только для С++)

class

struct

union

список-перечислимых-данных:

нумератор

список-нумераторовнумератор

нумератор:

идентификатор

идентификатор = выражение-типа-константы

выражение-типа-константы:

условное-выражение

спецификация-типа-компоновки: (только для С++)

extern строка (* <список-объявления> *)

extern строка объявление

список-объявления:

объявление

список-объявления  объявление

Для следующей таблицы отметим, что на количество и порядок модификаторов и квалификаторов наложены ограничения. Кроме того, перечисленные модификаторыявляются единственнымдополнением синтаксиса декларатора, не входящим в стандарт ANSI C и С++. Каждый модификатор подробно описан, начиная со стр.46 оригинала.

Синтаксис декларатора Turbo C++                              Таблица 1.11

список-декларатора:

инициализатор-декларатор

список-декларатораинициализатор-декларатор

инициализатор-декларатор:

имя-декларатора

список-модификаторов

операция-указателядекларатор

декларатор (список-объявления-параметров)

<список-со-квалификаторов>

(список-со-квалификаторов - только для С++)

декларатор [<выражение-типа-константы>]

список-модификаторов:

модификатор

список-модификаторов  модификатор

модификатор:

cdecl

pascal

interrupt

near

far

huge

операция-указателя:

* <список-со-квалификаторов>

& <список-со-квалификаторов> (только для С++)

имя-класса = *<список-со-квалификаторов> (только для C++)

список-со-квалификаторов:

со-квалификатор <список-со-квалификаторов>

со-квалификатор:

const

volatile

имя-декларатора:

имя

имя-класса (только для С++)

имя-класса (только для С++)

имя-typedef

имя-типа:

спецификатор-типа <абстрактный-декларатор>

абстрактный-декларатор:

операция-указателя <абстрактный-декларатор>

<абстрактный-декларатор> (список-аргументов-объявления) <список-со-квалификаторов>

<абстрактный-декларатор> [<выражение-типа-константы>]

список-объявления-аргументов:

<список-объявления-арг>

список-объявления-арг, ...

<список-объявления-арг>...(только для С++)

список-объявления-арг:

объявление-аргументов

список-объявления-арг  объявление-аргументов

объявление-аргументов:

спецификаторы-объявления  декларатор

спецификаторы-объявления декларатор = выражение (только для С++)

спецификаторы-объявления <абстрактный-декларатор>

спецификаторы-объявления <абстрактный-декларатор> =выражение (только для С++)

определение-функции:

<спецификаторы-объявления> декларатор <инициализатор>

тело-функции

тело-функции:

составной оператор

инициализатор:

= выражение

= (список-инициализаторов)

(список-выражений) (только для С++)

список-инициализаторов:

выражение

список-инициализаторов , выражение

(список-инициализаторов<,>)

Внешние объявления и определения

Спецификаторы класса памяти auto и registerво внешнем объявлении появиться не могут (см. "Единицы трансляции"). Для каждого идентификатора в единице трансляции, объявленной с внешним типомкомпоновки, может существовать не более одного внешнего определения.

Внешнее определение - это внешнее объявление, которое также определяет объект или функцию;таким образом, оно также распределяет память. Если идентификатор, объявленный с внешним типомкомпоновки, используется в выражении (не являющемся частью операции sizeof), то во всей программе должно иметьсяв точности одно внешнее определение данного идентификатора.

Turbo C++ позволяет затем переобъявление внешних имен, таких как массивы, структуры и объединения, добавляя информацию к ранее выполненным объявлениям. Например,

int a[]                 // нет размера

struct mystruct;                       // только тег, без объявления компонентов

...

int a[3] = [1, 2, 3];   // задание размера и инициализация

struct mystruct (*

int i, j;

*);             // добавление деклараторов компонентов

Объявления классов Turbo C++ (только С++)                                    Таблица 1.12

спецификатор-класса:

заголовок-класса (<список-компонентов>)

заголовок-класса:

ключ-класса <идентификатор> <базовый-спецификатор>

ключ-класса имя-класса <базовый-спецификатор>

список-компонентов:

объявление-компонента <список-компонентов>

спецификатор-доступа : <список-компонентов>

объявление-компонента:

<спецификаторы-объявления><список-декларатора-компонентов>;

определение-функции <;>

квалифицированное-имя;

список-декларатора-компонентов:

декларатор-компонента

список-декларатора-компонентов, декларатор-компонента

декларатор-компонента:

декларатор <pure-спецификатор>

<идентификатор> : выражение-типа-константы

pure-спецификатор:

=0

базовый-спецификатор:

:базовый-список

базовый-список:

базовый-спецификатор

базовый-список, базовый-спецификатор

базовый-спецификатор:

имя-класса

virtual <спецификатор-доступа> имя-класса

спецификатор-доступа Юvirtual> имя-класса

спецификатор-доступа:

private

protected

public

имя-функции-преобразования:

operator имя-типа-преобразования

имя-типа-преобразования:

спецификация-типа <операция-указателя>

инициализатор-конструктора:

: список-инициализаторов-памяти

список-инициализаторов-памяти:

инициализатор-памяти

инициализатор-памяти, список-инициализаторов-памяти

инициализатор-памяти:

имя-класса (<список-аргументов>)

идентификатор (<список-аргументов>)

имя-функции-операции:

operator операция

операция: одно из

new delete sizeof

+   -  * /%                         ^

&   \! !=                       <>

+=        -=  *= /=%=     ^=

&=       \!=  << >>>>=    <<=

==        !=  <= >=&&     \!\!

++        --  , ->*->     ()

[]          .*

Спецификаторы типа

Спецификатор типа с одним или более опциональным модификатором используется для задания типа объявляемого идентификатора:

int i;                   // объявление i как целого со знаком

unsigned char ch1, ch2; // объявление двух символьных без знака

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40