Под областью видимости понимают некоторую часть программы, в пределах которой использование переменной или функции, будет допустимо. Область видимости определяется местом, где её объявили. Соответственно, функция или переменная, объявленная вне тела программы или с использованием ключевого слова extern, становится глобальной и доступной в любой её части. Исключением будут являться методы, определённые в классе как private или protected, а так же некоторые ситуации с использование пространства имён. Пример 1. Область видимости переменной в программе: #include <iostream> using namespace std; int main() //Начало области видимости тела программы { int k1; //Создание переменной k1 в теле функции, которое ограничивает её область видимости cin >> k1; int k2 = k1; cout << k2; return 0; } //Конец области видимости тела программы В данном примере, переменная k1 видна лишь в теле программы, где она была объявлена. Поэтому, ошибкой будет попытка использования этой переменной (k1) вне её тела. Поэтапное исправление кода можно увидеть в реализации данного примера в GIT. Пример 2. Область видимости метода: #include <iostream> using namespace std; class A //Объявление класса А { public: int S() { return 2; } //Описание метода типа public int F() { return 1; } }; int main() { A a; int k2 = a.S(); cout << k2; //ОК: Использование "открытого" метода в теле программы int k1 = a.F(); cout << k1; return 0; } В нашем случае, оба метода являются типом public, поэтому код будет компилироваться без проблем. Однако, если ссылаться на член типа private, объявленному в классе А, компилятор выдаст ошибку. В то время, как метод, описанный как public, может быть вызван вне тела класса. Поэтому в примере из GIT мы будем исправлять неправильный код. Пример 3. Область видимости в функции: #include <stdio.h>
int main()
{
{
goto metka; // metka в области видимости, даже если объявлена позже
}
metka: printf ("hello! /n");
} В примере под номером 3 представлена реализация области видимости функций при помощи оператора goto. Ошибкой в данном коде было бы использование метки в теле другой функции. Реализация данного примера в GIT Пример 4. Область видимости пространства имён: namespace N //объявление пространства имён N { int a; int f(int a) { return a; } namespace { int x; } } //область видимости a, f(), x прерывается namespace { int l = 1; //переменная безымянного пространства имён } namespace N { int f(char a) { return l+a; } // перегрузка функции, с использованием переменной из безымянного пространства имён int i; } int main() { using namespace N; // возобновляется область видимости a, f(), x x = 1; l = 3; } В этом примере происходит использование пространства имён. Ошибкой считалась бы попытка создания одноимённой функции, с использованием другого типа, как показано на примере GIT. |