Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiS.doc
Скачиваний:
81
Добавлен:
13.04.2015
Размер:
815.1 Кб
Скачать

12 Уточнение понятий языка

12.1 Объявление, определение, инициализация

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

Определение соединяет имя с материальной сущностью. Для переменной — это область памяти, для функции — код программы, для константы — конкретное значение. Большинство объявлений являются одновременно и определениями.

П р и м е р ы.

int i; — объявление и определение переменой;

int f(int i); — объявление функции;

extern char c; — объявление внешней переменной.

Объявлений имени может быть несколько (но одинаковых!), а определение имени — только одно.

Инициализация — это задание значения имени при его определении.

П р и м е р ы.

const float pi = 3.14; — объявление, определение и инициализация

int i = 10; — то же.

З а м е ч а н и е. Глобальные и статические локальные (см. ниже) объекты неявно инициализируются нулем.

12.2 Область видимости и время жизни

Объявление вводит имя в область видимости. Для локального имени (объявленного в блоке или в функции) область видимости простирается от точки объявления до конца блока. Для глобального имени область видимости распространяется от точки объявления до конца файла, в котором имя объявлено.

Локальное имя может скрывать глобальное или внешнее локальное имя. К скрытому глобальному имени NAME можно получить доступ с помощью операции разрешения видимости.

::NAME

К скрытому локальному имени получить доступ нельзя.

Параметры функции считаются объявленными в самом внешнем блоке функции.

Как правило, объект создается, когда встречается его определение, и уничтожается, когда управление выходит из его области видимости. Глобальные объекты создаются один раз и “живут” до окончания программы. Так же ведут себя локальные объекты с описателем static.

ПРИМЕР. Сокрытие имени в блоке.

#include <iostream.h>

int i; // глобальная переменная

void main(){

int i = 1; // внешняя локальная переменная

{

int i = 2; // внутренняя локальная переменная

cout << i << ::i << '\n';

}

}

12.3 Типы

Каждое имя в С++ имеет тип, который определяет возможные операции над именем.

Имена типов используют:

— в спецификации другого имени, например, int i;

— в операциях new и sizeof, например, new char;

— в явных преобразованиях типов, например, long(b).

Неявные преобразования типов могут искажать или терять информацию, поэтому их следует избегать. Явные преобразования типов выполняются в двух формах:

традиционной (double) a,

функциональной double(a).

Функциональная форма преобразования не может быть применена, когда тип составной.

12.4 Производные типы

Производные типы конструируются из базовых при помощи следующих адресных операций (в порядке убывания приоритета):

1) массивы [ ],

2) функции ( ),

3) ссылки &,

4) указатели *,

5) константы const,

6) структуры struct,

7) объединения union,

8) классы class.

В декларации типа можно выделить 2 части: заголовок и декларатор. Например, в декларации

int *p, i, *m[10];

int — заголовок, а *p, i и *m[10] — три декларатора.

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

Примеры объявлений производных типов.

typedef int *t указатель на целое,

typedef char t [10] массив символов,

typedef int *t [10] массив указателей на целое,

typedef int (*t) [10] указатель на массив из целых,

typedef int* (*t) [10] указатель на массив указателей на целое.

Для лучшего понимания последнего примера построим его поэтапно.

typedef int* t1; // t1 — указатель на целое,

typedef t1 t2 [10]; // t2 — массив указателей на целое,

typedef t2 *t; // t — указатель на массив указателей на целое.

Сделаем подстановки согласно определениям

int* t1 int* t2 [10] int* (*t) [10].

З а д а ч а. Описать переменную типа:

а) массива ссылок на float;

б) массива указателей на целую функцию одного целого аргумента;

в) ссылки на массив ссылок на int.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]