Вы находитесь на странице: 1из 2

using объявления вносят имя в ТЕКУЩУЮ область видимости.

using std::cout;

Using-директива приводит к тому, что ВСЕ члены пространства имен выглядят


объявленными вне этого пространства, добавляя их в новую область видимости.

using namespace std;

Using-директива НЕ скрывает имена, а лишь вносит в текущую облать видимости. Using-


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

* using-объявление - сохраняет пространство имен, но создает ассоциированные с его


членами локальные синонимы.
* using-директивой - полностью удаляет границы пространства имен.

Еще немного формулировок:

* using-директива - для определенной области видимости стирает границы заданного


пространства имен.
* using-объявление - вносит имя в текущую область видимости, скрывая все имена из
внешних областей видимости, но не влияет на поиск Кенига(правило об объявлении в
области БЛОКА).

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


использующие пространства имен. Однако употребление большого числа using-директив
возвращает нас к проблеме засорения ГЛОБАЛЬНОГО пространства имен. Эту проблему
можно свести к минимуму, если заменить using-директивы более селективными using-
объявлениями. Ошибки неоднозначности, вызываемые ими, обнаруживаются в момент
объявления. Мы рекомендуем пользоваться using-объявлениями, а не using-директивами,
чтобы избежать засорения глобального пространства имен в своей программе.

- Работают при любом типе поиска именен;


- Директивы using игнорируются при ADL.

@@@ Область видимости объявлений и директив using.

Если объявление using или директива using используется в блоке, имена применимы
только в этом блоке (они следуют обычным правилам области видимости блока). Это
хорошо, поскольку снижает вероятность возникновения конфликтов имен внутри этого
блока.

Если объявление using или директива using используются в глобальном пространстве


имен, имена применимы ко всему остальному файлу (они имеют область видимости
файла).

@@@ Манипуляции с именами:

* Перегрузка функции означает наличие другой функции с тем же именем в той же


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

* Замещение, или переопределение виртуальной функции означает наличие в производном


классе другой функции с тем же именем
и с теми же типами параметров.
* Сокрытие функции в окружающей области видимости(базовый класс, внешний класс или
пространство имен) означает наличие другой
функции с тем же именем(необязательно с такой же сигнатурой) во вложенной области
видимости(производный класс, вложенный класс или пространство имен), так что эта
функция скрывает функцию(и) с тем же именем из объемлющей области видимости.

## Особенности поиска имен(unqualified name lookup)

Сначала компилятор просматривает непосредственную область видимости(например


область видимости производного класса) и составляет список всех функций с искомым
именем,
независимо от их сигнатуры и уровня доступа. И ТОЛЬКО если компилятор не находит
ни одной такой функции, он продолжает поиск в охватывающей области видимости
(например в области видимости базового класса). Так происходит до тех пор, пока в
конце концов будут просмотрены все области видимости, но функция с таким именем
окажется не
найденной, либо пока не будет обнаружена область видимости, содержащая по крайней
мере одну искомую функцию, компилятор прекращается поиск и работает с найденными
кандидатами, выполняя разрешение перегрузки и применяя правила доступа.

@@@ Рекомендация:
При использовании функции с тем же именем, что и у унаследованной функции,
убедитесь, что унаследованные функции внесены в область видимости с помощью
объявления using, если только вы не намерены скрывать их.

* Разумно используйте пространства имен. Если вы помещаете класс в пространство


имен, убедитесь, что вы разместили в том же пространстве
все вспомогательные функции и операторы. Если не сделать этого, в своем коде вы
можете обнаружить самые неожиданные и нежелательные
сюрпризы, см(№).

Ссылки:
* https://radioprog.ru/post/1130
* https://habr.com/ru/post/550442/

Вам также может понравиться