Область видимости

Под областью видимости понимают некоторую часть программы, в пределах которой использование переменной или функции, будет допустимо. 
Область видимости определяется местом, где её объявили.
Соответственно, функция или переменная, объявленная вне тела программы или с использованием ключевого слова 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
    
    int f(char a) { return l+a; } // перегрузка функции, с использованием переменной из безымянного пространства имён
    int i; 
    
}
 
int main() 
{
    using namespace N; // возобновляется область видимости a, f(), x
    x = 1; 
    l = 3;

В этом примере происходит использование пространства имён. Ошибкой считалась бы попытка создания одноимённой функции, с использованием другого типа, как показано на примере GIT.

Comments