Каждая переменная имеет свою область видимости, то есть такую область, в которой можно работать с переменной. За пределами этой области, о данной переменной ничего известно не будет, а значит и использовать её нельзя. Итак, переменная находится в области видимости, если к ней можно получить доступ.
Существуют локальные и глобальные переменные. Так вот, переменные, объявленные внутри функции, называются локальными. Локальные переменные имеют свои области видимости, этими областями являются функции, в которых объявлены переменные. Таким образом, в разных функциях можно использовать переменные с одинаковыми именами, что в свою очередь очень удобно. Разделение переменных на глобальные и локальные соответствует одному из главных правил программирования, а именно – принципу наименьших привилегий. То есть, переменные, объявленные внутри одной функции, должны быть доступны только для этой функции и ни чему другому, в конце концов, они создавались именно для этой функции. Глобальные переменные объявляются вне тела какой-либо функции, и поэтому область видимости таких переменных распространяется на всю программу. Обычно глобальные переменные объявляются перед главной функцией, но можно объявлять и после функции main()
, но тогда данная переменная не будет доступна в функции main()
.
Разработаем программу, в которой будут объявлены две переменные, локальная и глобальная, с одинаковым именем.
// variables.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include <iostream> using namespace std; void example(); int variable = 48; // инициализация глобальной переменной int main(int argc, char* argv[]) { int variable = 12; // инициализация локально переменной cout << "local variable = " << variable << endl; // печать значения содержащегося в локальной переменной example(); // запуск функции system("pause"); return 0; } void example() { cout << "global variable = " << variable << endl; // функция видит только глобальную переменную }
// код Code::Blocks
// код Dev-C++
// variables.cpp: определяет точку входа для консольного приложения. #include <iostream> using namespace std; void example(); int variable = 48; // инициализация глобальной переменной int main(int argc, char* argv[]) { int variable = 12; // инициализация локально переменной cout << "local variable = " << variable << endl; // печать значения содержащегося в локальной переменной example(); // запуск функции return 0; } void example() { cout << "global variable = " << variable << endl; // функция видит только глобальную переменную }
В строках 8 и 12 объявлены переменные одинакового типа с одним и тем же именем variable
, но переменная в строке 8 является глобальной переменной, а переменная в строке 12 — это локальная переменная. Функция example()
имеет доступ только к глобальной переменной. В то время как функция main()
имеет доступ как к локальной так и к глобальной переменным. Если в области видимости есть и локальная и глобальная переменные с одинаковыми именами, то при обращении к ним, будет использоваться ближайшая переменная, а это локальная переменная, это видно по результату работы программы (см. Рисунок 1).
local variable = 12 global variable = 48
Рисунок 1 — Локальные и глобальные переменные в С++
Как мы уже сказали, функция main()
имеет доступ и к глобальной переменной, но не показали, как получить этот доступ. В С++ существует такая операция, как разрешение области действия ::
. Эта операция позволяет обращаться к глобальной переменной из любого места программы.» Все, что нужно сделать, так это поставить двойное двоеточие перед именем переменной. Ниже показан код, верхней программы с одним лишь изменением, и это изменение – операция разрешения доступа в строке 13.
// variables.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include <iostream> using namespace std; void example(); int variable = 48; // инициализация глобальной переменной int main(int argc, char* argv[]) { int variable = 12; // инициализация локально переменной cout << "local variable = " << ::variable << endl; // печать значения содержащегося в глобальной переменной example(); // запуск функции system("pause"); return 0; } void example() { cout << "global variable = " << variable << endl; // функция видит только глобальную переменную }
// код Code::Blocks
// код Dev-C++
// variables.cpp: определяет точку входа для консольного приложения. #include <iostream> using namespace std; void example(); int variable = 48; // инициализация глобальной переменной int main(int argc, char* argv[]) { int variable = 12; // инициализация локально переменной cout << "local variable = " << ::variable << endl; // печать значения содержащегося в глобальной переменной example(); // запуск функции return 0; } void example() { cout << "global variable = " << variable << endl; // функция видит только глобальную переменную }
Операция разрешения области действия ставится перед именем глобальной переменной, и даже, если есть локальная переменная с таким же именем, программа будет работать со значением, содержащимся в глобальной переменной. Результат работы программы (см. Рисунок 2).
local variable = 48 global variable = 48
Рисунок 2 — Локальные и глобальные переменные в С++
Комментарии
Богдан
я так понимаю что «::» означает содержимое подключаемых модулей этого класса(в джава это super)? я так понял?