- •Алфавиты и типы данных. Целые и плавающие типы.
- •Выражение присваивания. Арифметические операции с целыми и плавающими переменными.
- •Логические операции, операции автоувеличения и автоуменьшения, тернарная операция.
- •Составной оператор. Условный оператор.
- •Оператор switch – case. Оператор безусловного перехода, break, continue.
- •Операторы цикла. Оператор безусловного перехода, break, continue.
- •Указатели. Указатели и массивы. Адресная арифметика.
- •Символьные массивы и строки. Указатели и многомерные массивы.
- •9. Операции для работы с динамической памятью.
- •10. Объявления и определения. Область существования имени.
- •11. Область видимости имён. Классы памяти.
- •12. Объявления объектов и типов. Синоним имени типа.
- •13. Правила преобразования стандартных типов. Неявные преобразования стандартных базовых типов. Преобразования производных стандартных типов.
- •14. Функции. Передача аргументов. Указатели на функции.
- •15. Ссылки. Передача аргументов в функции по ссылке.
- •16. Функции. Аргументы по умолчанию и переопределение функций.
- •17. Шаблоны функций.
- •Перечисления
- •Классы. Конструкторы и деструкторы.
- •Статические члены класса
- •Указатель this. Статические функции-члены.
- •Указатели на члены класса
- •Конструктор копирования и операция присваивания
- •Дружественные (привилегированные) функции
- •Производные классы. Построение. Защищенные классы. Производные классы Построение производного класса
- •Защищенные члены класса
- •Управление уровнем доступа к членам класса
- •19.4. Последовательность вызова конструктора и деструктора при построении производного класса на основе одного базового
- •Преобразования типов. Связь с наследованием. Преобразование типов
- •Раннее и позднее связывание (полиморфизм). Виртуальные функции. Полиморфизм
- •Раннее и позднее связывание
- •Виртуальные функции
11. Область видимости имён. Классы памяти.
Если, используя имя, можно получить доступ к элементу, с которым это имя сопоставлено, то говорят, что данное имя находится в области своей видимости.
Область видимости является подобластью области существования имени. Если элемент языка, чьё имя находится в области своего существования, тем не менее, недоступен по этому имени, то будем говорить, что это имя скрыто или замаскировано.
Глобальные имена видимы от точки их объявления до конца файла, если они не замаскированы локальными именами.
Переменные из объемлющих блоков, как и глобальные, видимы во внутренних блоках.
Если переменная, объявленная внутри блока, имеет то же имя, что и переменная объемлющего уровня, то имя объемлющего уровня маскируется и определение переменной в блоке заменяет определение объемлющего уровня на протяжении всего блока. Видимость замаскированной переменной восстанавливается при выходе из блока. Метки в функции видимы во всём теле функции.
int i=3;
{ int c = i; // с становится = =3;
...
int i = 0; // имя i маскирует внешнее имя i;
cout << "c = "<< c <<", i= "<< i << ".\n";
} // конец области существования имен i, c из блока; опять видно имя i, объявленное перед блоком.
cout << " i = "<< i << ".\n";
Здесь будет выведено c=3, i=0.
i=3.
Если скрытым именем является глобальное имя функции или объекта, то обратиться к нему можно, используя операцию разрешения доступа, или разрешения контекста ::.
int i=5; // Глобальная переменная;
void main (){
int i=1; // локальная переменная.
i++;
::i++;
cout<< "i="<< i<< ", глобальное i="<< ::i<< ".\n";
}
Здесь будет напечатано i=2, глобальное i=6.
С помощью операции :: нельзя обратиться к скрытому локальному объекту.
Классы памяти.
В С++ существуют 3 класса памяти.
1) Статическая память - статические данные, размещаемые в сегменте данных;
2) автоматические данные, размещаемые в специальном стеке (сегмент стека) или как частный случай, в регистрах процессора;
3) динамические данные, явно размещаемые в динамической памяти с помощью операций new и delete.
Статические объекты существуют в течение всего времени выполнения программы. К ним относятся глобальные и локальные переменные, объявленные со служебным словом static:
int i=3, j; // глобальные переменные. Класс памяти - static;
void main(){
int a; // Автоматическая переменная;
static float b[1000], c=2.3; // статические переменные;
...
...
}
int f(){int d; // автоматическая переменная;
static int m=2, k; // статические переменные m, k.
...
}
Статические и глобальные переменные, если они не инициализированы явно, инициализируются нулевыми значениями. В любом случае, инициализация статических переменных осуществляется только один раз.
Локальные переменные, не объявленные как static, являются автоматическими. Такие объекты начинают свое существование при объявлении его имени в блоке и заканчивают его при завершении этого блока. Если автоматический объект явно не инициализирован, то его значение до присвоения не определено.
void f();
void main(){
for (int i = 3; i > 0; i- -) f();
}
void f(){static int i; int j = 0;
cout<< "i ="<< i++<< " j ="<< j++<< "\n";
}
Здесь будет напечатано: i = 0 j = 0
i = 1 j = 0
i = 2 j = 0
Заметим, что если служебное слово static применено к глобальной переменной или к имени функции, то оно имеет другой смысл. В этом случае и глобальная переменная, и функция становятся видимы только в пределах файла, где они определены и невидимы из других файлов.