- •Алфавиты и типы данных. Целые и плавающие типы.
- •Выражение присваивания. Арифметические операции с целыми и плавающими переменными.
- •Логические операции, операции автоувеличения и автоуменьшения, тернарная операция.
- •Составной оператор. Условный оператор.
- •Оператор switch – case. Оператор безусловного перехода, break, continue.
- •Операторы цикла. Оператор безусловного перехода, break, continue.
- •Указатели. Указатели и массивы. Адресная арифметика.
- •Символьные массивы и строки. Указатели и многомерные массивы.
- •9. Операции для работы с динамической памятью.
- •10. Объявления и определения. Область существования имени.
- •11. Область видимости имён. Классы памяти.
- •12. Объявления объектов и типов. Синоним имени типа.
- •13. Правила преобразования стандартных типов. Неявные преобразования стандартных базовых типов. Преобразования производных стандартных типов.
- •14. Функции. Передача аргументов. Указатели на функции.
- •15. Ссылки. Передача аргументов в функции по ссылке.
- •16. Функции. Аргументы по умолчанию и переопределение функций.
- •17. Шаблоны функций.
- •Перечисления
- •Классы. Конструкторы и деструкторы.
- •Статические члены класса
- •Указатель this. Статические функции-члены.
- •Указатели на члены класса
- •Конструктор копирования и операция присваивания
- •Дружественные (привилегированные) функции
- •Производные классы. Построение. Защищенные классы. Производные классы Построение производного класса
- •Защищенные члены класса
- •Управление уровнем доступа к членам класса
- •19.4. Последовательность вызова конструктора и деструктора при построении производного класса на основе одного базового
- •Преобразования типов. Связь с наследованием. Преобразование типов
- •Раннее и позднее связывание (полиморфизм). Виртуальные функции. Полиморфизм
- •Раннее и позднее связывание
- •Виртуальные функции
10. Объявления и определения. Область существования имени.
Любое имя, за исключением имён меток, должно быть объявлено в программе:
int i, j;
double d=7.3;
extern int m;
typedef unsigned int size_t;
int add (int a, int b){ return a+b;}
void func (char*, int);
После этих объявлений компилятор знает, что i, j, m - имена переменных типа int, d - имя переменного типа double, size_t - имя типа, а add и func - имена функций.
В объявлении с именем может сопоставляться не только некоторый тип. С именем может быть сопоставлен некоторый элемент, идентификатором которого оно является. Например, при объявлении int i, j; для переменных i, j отводится память, с этими именами сопоставляются участки памяти по 2 байта, которые можно использовать для хранения значений переменных. С именем size_t сопоставлено имя конкретного типа (unsigned int), синонимом которого является теперь size_t; с именем add сопоставлен код функции. Все такие объявления называют определениями. Однако не все объявления являются определениями. Из всех вышеприведённых объявлений два не являются определениями:
extern int m;
void func (char *, int);
В первом из этих объявлений сообщается только, что переменная m имеет тип int, память же для неё должна выделяться где-то в другом месте, о чём говорит ключевое слово extern.
Второе объявление говорит, что func есть имя функции с двумя аргументами, первый из которых - указатель на char, а второй - int, а сама функция не возвращает никакого значения. Такое объявление называют прототипом функции. Сама же функция func должна быть определена вместе со своим телом где-то в другом месте.
В программе для каждого имени должно присутствовать одно и только одно определение, в то время как объявлений, не являющихся определениями, может быть как угодно много.
После объявления имя можно использовать. Однако оно, как правило, может быть использовано только в некоторой части программы, которая называется областью существования имени.
Текст программы можно разместить в одном файле, а можно и в нескольких различных файлах, каждый из которых содержит целиком одну или несколько функций. Для объединения в одну программу эти файлы компилируются совместно. Информация обо всех этих файлах помещается в так называемый файл проекта (с расширением .prj). Компилятор для каждого исходного файла создаёт объектный код (файл с расширением .obj). Затем все объектные файлы (вместе с библиотечными) объединяются компоновщиком в исполняемый, или загрузочный модуль, который имеет имя файла проекта и расширение .ехе. Область существования имени нужна компилятору для того, чтобы сгенерировать верный машинный код.
Можно выделит 5 видов областей существования имени.
Область существования БЛОК. Блок - это фрагмент программы, заключённый в фигурные скобки { }, например
if (a != 5) {
int j=0;
double k = 3.5;
a++;
...
}
Заметим, что тело любой функции является блоком.
Имя, объявленное в блоке, может быть использовано от точки, где находится его объявление, и до конца блока. Такую же область существования имеют и имена в определении функции:
int f1 (int i){ return i; }
Имя i имеет область существования "блок". Область существования "блок" распространяется и на вложенные блоки.
Область существования ФУНКЦИЯ. Эту область существования имеют только имена меток перехода, используемые оператором goto:
void f (){….
goto lab;
{... lab: ...}
...
}
Область существования ПРОТОТИП ФУНКЦИИ. Прототип функции есть объявление функции, не являющееся её определением и имеющий, например, вид: int F(int a, double b, char* str);
Область существования "прототип" заключена между открывающей и закрывающей круглыми скобками. Иначе говоря, имена a, b, str в примере определены только внутри круглых скобок. Из этого следует, что в прототипах можно использовать для аргументов любые имена или не использовать их совсем: int F(int, double, char*);
Область существования ФАЙЛ. Область существования "файл" имеют имена, объявленные вне любого блока и класса. Такие имена называют глобальными. Глобальные имена определены от точки их объявления и до конца файла, где встретилось их объявление. Примером таких имён являются имена функций.
#include
int a, b, c[40]; // Глобальные имена;
int f1() // локальное имя f1;
{int i; … // локальное имя;
}
int count; // глобальное имя;
void f2() { ... } // глобальное имя f2.
Область существования КЛАСС.
Такую область существования имеют имена, объявленные в классах. Эти имена определены во всем классе, в котором они объявлены, независимо от точки их объявления.