Урок 54. Using statements

   ⁄ 

 Обновлено 21 Апр 2017

  ⁄   

Если вы часто используете стандартную библиотеку языка C++, то постоянное добавление префикса «std::» может быть довольно утомительным, не правда ли? C++ предоставляет некие альтернативы упрощения, так называемые «using statements».

Использование using declaration

Одним из способов упрощения является использование using declaration. Вот программа «Hello, world!» с using declaration в строке 5:

Using declaration «using std::cout;» сообщает компилятору, что мы будем использовать объект «cout» из пространства имен std. И каждый раз, когда компилятор будет сталкиваться с «cout», он будет понимать, что это «std::cout». Если вдруг возникнет конфликт имен между std::cout и некоторыми другими использованиями cout, предпочтение будет за std::cout. Поэтому в строке 6 мы можем записать просто «cout».

Конечно, в этом случае мы не сэкономили много усилий, но в программе, где объекты из пространства имен std используются сотни, если не тысячи раз, using declaration очень пригодится как для экономии времени и усилий, так и для улучшения читабельности кода. Также для каждого объекта нужно использовать отдельное using declaration (например: отдельно для std::cout, отдельно для std::cin и отдельно для std::endl).

Хоть этот способ является менее предпочтительным, чем использование префикса std::, он всё же является абсолютно безопасным и приемлемым.

Использование using directive

Второй способ упрощения – использовать using directive. Вот программа «Hello, world!» с using directive в строке 5:

Много разработчиков спорят насчет использования этой директивы. Так как с её помощью мы подключаем ВСЕ имена с пространства имен std — вероятность возникновения конфликтов имен значительно возрастает (но все же эта вероятность в глобальном масштабе остается незначительной). Using directive «using namespace std;» сообщает компилятору, что мы хотим использовать всё, что находится в пространстве имен std, так что если компилятор найдет имя, которое не сможет распознать, он будет проверять его наличие в пространстве std.

Совет: мы не рекомендуем использовать «using directive» вообще.

Пример конфликта c using directive

Рассмотрим пример, где использование using directive создает неопределенность:

Здесь компилятор не может понять, используем ли мы std::cout или функцию cout, которую определили выше. В результате получим ошибку «ambiguous symbol». Хоть это банальный пример, но если бы мы добавили префикс std:: к cout:

или использовали бы using declaration вместо using directive:

тогда наша программа была бы без ошибок.

Большинство программистов избегают использования using directive именно по этой причине. Другие считают это приемлемым до тех пор, пока using directive используется только в пределах отдельных функций (что значительно сокращает масштабы возникновения конфликтов имен).

Ограничение области видимости using declaration и using directive

Если using declaration или using directive используются в блоке, то они применяются только внутри этого блока (по обычным правилам локальной области видимости). Это хорошо, поскольку уменьшает масштабы возникновения конфликтов имен до отдельных блоков. Однако многие начинающие программисты пишут using directive в глобальной области видимости (вне функции main() или вообще вне любых функций). Этим они вытаскивают все имена из пространства имен std прямо в глобальную область видимости, значительно увеличивая вероятность возникновения конфликтов имен. А это уже не хорошо.

Правило: никогда не используйте стейтменты «using» вне функций.

Отмена или замена стейтментов using

Как только один стейтмент using был объявлен, его невозможно отменить или заменить другим стейтментом using в пределах области видимости, в которой он был объявлен.

Лучшее, что вы можете сделать – это намеренно ограничить область применения стейтментов using с самого начала, пользуясь правилами локальной области видимости.

Конечно, всей этой головной боли можно было бы избежать, просто использовав оператор разрешения области видимости (::).

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (9 оценок, среднее: 5,00 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *