Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4138

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Часть II. Язык программирования С++ 

156 

пространство имен 

MyNames

 можно расширить в другом исходном 

файле: 

  namespace  MyNames 
  { 
    int n; 
    int sub(int a, int b); 
  } 

Пространства  имен  могут  быть  вложенными  друг  в  друга.  На-

пример: 

  namespace PublicNames 
  { 
    int n; 
    namespace MyNames 
    { 
      int add(int a, int b) { return a + b; } 
    } 
  } 

12.2. Анонимные пространства имен 

По  умолчанию  существует  анонимное  пространство  имен,  кото-

рое доступно во всех исходных файлах и которое не нужно объ-

являть.  Это  пространство  имен  называется 

глобальным

.  Можно 

сказать,  что  все  пространства  имен  вложены  в  глобальное  про-

странство  имен.  Все  имена,  которые  не  входят  ни  в  одно  про-

странство  имен,  по  умолчанию  принадлежат  глобальному  про-

странству имен. 
Имена  из  заголовочных  файлов,  которые  имеют  расширение  h, 

принадлежат глобальному пространству имен. 
В каждом исходном файле также можно объявить 

локальное ано-

нимное пространство имен

, которое видимо только в этом фай-

ле. Это пространство имен объявляется следующим образом: 

  namespace 
  { 
    // тело пространства имен 
  } 


background image

Глава 12. Пространства имен 

157 

Локальное анонимное пространство имен может быть вложено в 

другое именованное пространство имен. Например: 

  namespace MyNames 
  { 
    namespace 
    { 
      int add(int a, int b) { return a + b; } 
    } 
  } 

12.3. Стандартное пространство имен 

По  умолчанию  в  языке  программирования  С++ существует  про-
странство имен 

std

, которое называется 

стандартным

. Имена из 

заголовочных файлов, которые не имеют расширения, принадле-

жат стандартному пространству имен. 
В  листинге  12.1  приведен  пример  использования  имен  из  стан-
дартного  пространства 

std

.  Как  видно,  в  этом  случае  нужно  ис-

пользовать  оператор  разрешения  области  видимости,  который 

будет рассмотрен в следующем разделе. 

Листинг 12.1. Использование имен из стандартного  
пространства 

std

 

#include <iostream> 
int main() 

  std::cout << "Hello word" << std::endl; 
  return 0; 

12.4. Оператор разрешения  

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

Для доступа к именам пространства имен используется оператор 
разрешения  области  видимости 

::

,  который  имеет  следующий 

синтаксис: 

  имя_пространства_имен::имя_объекта 


background image

Часть II. Язык программирования С++ 

158 

В  этом  случае  имя  пространства  имен  называется 

квалифика-

тором имени объекта

. При этом отметим, что оператор разреше-

ния  области  видимости  выполняется  на  этапе  компиляции  про-

граммы и не влияет на ее производительность. Этот оператор ас-

социативен справа налево и имеет наивысший приоритет из всех 

операторов. 
В листинге 12.2 приведен пример доступа к именам при помощи 

оператора разрешения области видимости. 

Листинг 12.2. Доступ к именам при помощи оператора разрешения 

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

#include <iostream> 
namespace MyNames 

  int n, m; 
  int add(int a, int b) { return a + b; } 

int main() 

  int sum; 
  MyNames::n = 2; 
  MyNames::m = 3; 

 

  sum = MyNames::add(MyNames::n, MyNames::m); 
  std::cout << sum << std::endl;  // печатает 5 

 

  return 0; 

Для доступа к именам из глобального пространства имен исполь-

зуется  оператор  разрешения  области  видимости  без  квалифика-

тора.  Это  необходимо  в  случае,  если  глобальные  имена  скрыты 

локальными именами из не глобальной области видимости. 
В  листинге 12.3  приведен  пример  доступа  к  именам  из  глобаль-

ного пространства имен. 

Листинг 12.3. Доступ к именам из глобального пространства имен 

#include <iostream> 
int n = 10; 


background image

Глава 12. Пространства имен 

159 

namespace MyNames 

  int add(int n) { return n + ::n; } 

int main() 

  int n = 5; 
  int m = MyNames::add(n); 
 
  std::cout << m << std::endl;  // печатает 15 
 
  return 0; 

Для  доступа  к  именам  из  локального  анонимного  пространства 
оператор разрешения области видимости не используется. 
В листинге 12.4 приведен пример доступа к именам из локально-
го анонимного пространства имен. 

Листинг 12.4. Доступ к именам из локального  
анонимного пространства имен 

#include <iostream> 
int n = 10; 
namespace 

  int add(int n) { return n + ::n; } 

int main() 

  int n = 5; 
  int m = add(n); 
 
  std::cout << m << std::endl;  // печатает 15 
 
  return 0; 

Имя  переменной,  принадлежащее  локальному  анонимному  про-
странству  имен,  может  быть  недоступно  в  другом  пространстве 


background image

Часть II. Язык программирования С++ 

160 

имен. Это происходит в том случае, если это имя скрыто именем 
глобальной или локальной переменной. 
В  листинге  12.5  приведен  пример  неоднозначного  определения 
имени переменной в локальном анонимном пространстве имен. 

Листинг 12.5. Неоднозначное определение переменной 

#include <iostream> 
int n = 10; 
namespace 

  int n = 20; 

int main() 

  int m = n;  // ошибка компиляции: n - неоднозначный символ 
 
  std::cout << m << std::endl; 
 
  return 0; 

12.5. Объявление 

using

 

Для объявления имени из некоторого пространства имен исполь-
зуется объявление 

using

, которое может находиться в любой об-

ласти  видимости,  включая  область  видимости  любого  простран-
ства имен. Объявление 

using

 имеет следующий синтаксис: 

  using имя_пространства_имен имя_объекта; 

В  листинге  12.6  приведен  пример  использования  объявления 

using

Листинг 12.6. Использование объявления 

using

  

#include <iostream> 
using std::cout; 
int main() 


Смотрите также файлы