что означает ":: 'variable'"? - PullRequest
       3

что означает ":: 'variable'"?

4 голосов
/ 15 августа 2011

что означает :: я имею в виду в приведенной ниже программе?

#include<iostream>
using namespace std;
int i = 10;
int main(){
   int i = 20;
   {
   int i = 30;
   cout << i << ::i <<endl;
   }
}

Выводит "3010".«:: i», похоже, относится к глобальной декларации.Что это значит точно?

Ответы [ 8 ]

9 голосов
/ 15 августа 2011

Он называется Поиск квалифицированного имени.
Он ссылается на переменную i, объявленную в глобальной области видимости.
Просто это означает, что не следует ссылаться на локальную переменную i, если она есть, но ссылаться на i в глобальной области видимости.

Всякий раз, когда у вас есть переменные с одинаковыми именами в локальной области, при обращении к имени переменной предпочтение отдается переменной в локальной области. Это означает, что в вашей программе i внутри локальной области видимости { } скрывает все другие переменные с именем i, а именно те (i=20, а также i=10). Таким образом, для ссылки на i, который находится в глобальной области видимости, вы используете оператор разрешения области действия ::. =

4 голосов
/ 15 августа 2011

Переменные и функции, которые начинаются с оператора ::, описывают, что эта переменная или функция находится в глобальном пространстве имен (не локально).В вашем примере i означает локальную переменную, определенную в 7-й строке, а ::i означает глобальную переменную, определенную в 3-й строке.Но i не ссылается на внешнюю локальную переменную, которая определена в 5-й строке, потому что она переопределена и недоступна в этой области (строки 6-9).

3 голосов
/ 15 августа 2011

Оператор :: является оператором разрешения области действия . Когда вы пишете scopename::name, это означает, что вы ссылаетесь на объект / функцию / ... с именем name в области действия scopename (обычно это пространство имен); например, если вы не написали using namespace std; для использования cin / cout / ... вам нужно написать std::cin / std::cout / ...

Если оператору разрешения области не предшествует имя области, это означает, что вы явно ссылаетесь на объект, помещенный в глобальное пространство имен, поскольку глобальный i находится в вашей программе.

Это особенно полезно, если вы в настоящее время импортировали несколько пространств имен (используя директиву using namespace) или имеете локальные имена, которые скрывают глобальные имена. В вашем коде это именно то, что происходит: локальный i «скрывает» глобальный, и вам нужен :: для доступа к глобальному i.

Случайный совет : вы часто будете видеть ::, используемый для ссылки на глобальные идентификаторы, когда вы имеете дело с библиотеками C (которые не имеют понятия о пространствах имен), и вы хотите быть уверены, что вы ' повторный вызов определенной функции C вместо некоторого метода C ++, который скрывает ее в текущей области (это часто происходит в коде MFC, который хочет вызывать API-интерфейсы Windows).

0 голосов
/ 15 августа 2011

::i означает поиск i, который не вложен ни в что.В вашем случае это будет ссылка на i=10; Также см. Подстановочный знак поиска c / c ++ и синтаксис .

0 голосов
/ 15 августа 2011

::i относится к глобальной переменной.

:: используется для глобального пространства имен. Таким образом, ::i означает переменную i, объявленную в глобальном пространстве имен.

0 голосов
/ 15 августа 2011

Это просто оператор области видимости.Обычно используется для пространств имен.

0 голосов
/ 15 августа 2011

::i относится к i в глобальном пространстве имен.

0 голосов
/ 15 августа 2011

i в глобальном пространстве имен.

{
  int i = 30;
  cout << i << ::i <<endl;

  // 1. First i refers to the block scoped i having value 30
  // 2. ::i refers to the global variable i having the value 10
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...