Оператор ::
является оператором разрешения области действия . Когда вы пишете scopename::name
, это означает, что вы ссылаетесь на объект / функцию / ... с именем name
в области действия scopename
(обычно это пространство имен); например, если вы не написали using namespace std;
для использования cin
/ cout
/ ... вам нужно написать std::cin
/ std::cout
/ ...
Если оператору разрешения области не предшествует имя области, это означает, что вы явно ссылаетесь на объект, помещенный в глобальное пространство имен, поскольку глобальный i
находится в вашей программе.
Это особенно полезно, если вы в настоящее время импортировали несколько пространств имен (используя директиву using namespace
) или имеете локальные имена, которые скрывают глобальные имена. В вашем коде это именно то, что происходит: локальный i
«скрывает» глобальный, и вам нужен ::
для доступа к глобальному i
.
Случайный совет : вы часто будете видеть ::
, используемый для ссылки на глобальные идентификаторы, когда вы имеете дело с библиотеками C (которые не имеют понятия о пространствах имен), и вы хотите быть уверены, что вы ' повторный вызов определенной функции C вместо некоторого метода C ++, который скрывает ее в текущей области (это часто происходит в коде MFC, который хочет вызывать API-интерфейсы Windows).