Пространства имен в C++

обложка статьи

Здравствуйте, дорогие читатели!

В данной статье я бы хотел рассмотреть такую важную тему как пространства имен. Данная возможность языка широко используется как разработчики самого языка C++, так и представителями компаний, которые разрабатывают современное ПО.

Что такое пространство имен?

Для начала, давайте попробуем понять для чего вообще нужны эти самые пространства имен.

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

Давайте рассмотрим небольшой пример:

#include <iostream>

using namespace std;

namespace myMath { // наше пространство имен
    int abs(int x) { // функция нахождения модуля
        if (x < 0) {
            return -x;
        } else {
            return x;
        }
    }

    const double E = 2.718; // константа 
}

int main() {
    cout << "|-1| = " << myMath::abs(-1) << endl; // пользуемся пространством имен
    cout << "e^2 = " << myMath::E * myMath::E << endl;
    
    return 0;
}

Вот результат выполнения данного кода:

|-1| = 1
e^2 = 7.387524
Process returned 0 (0x0) execution time : 0.010 s
Press any key to continue.

Возможно вы уже догадались как использовать данную конструкцию, но для полного понимания давайте рассмотрим программу более подробно:

  1. Сначала мы объявляем пространство имен, в котором будем работать. Делается это при помощи ключевого слова namespace после которого следует имя пространства. Все то, что окажется внутри фигурных скобок будет принадлежать данному пространству имен.

  2. Далее мы указываем код, который хотим “наградить” специальным префиксом (в нашем случае это myMath::).

  3. Теперь мы можем использовать написанный ранее код также, как и код вне пространства имен с одной лишь разницей. Теперь мы обязаны указывать принадлежность функции или переменной к конкретному пространству имен. Делается это при помощи следующей конструкции:

    <имя пространства>::<имя его члена>

Как видите нет ничего сложного. Но это в некоторых случаях очень неудобно, постоянно указывать префикс. Хотелось бы иметь возможность использовать по умолчанию какое-либо пространство имен. Хорошо, что C++ поддерживает такую возможность.

Конструкция using namespace

Как вы можете заметить, в начале каждой программы мы для удобства опускали стандартный префикс std (стандартная библиотека шаблонов находится именно в данном пространстве имен). Делали мы это для удобства чтения кода, а также для того, чтобы не усложнять код наших программ. В реальных проектах рекомендуется этого не делать.

Так вот, чтобы опустить какой-либо префикс, нужно это поле ключевых слов using namespace указать имя пространства имен, префикс которого мы не хотим указывать. Вот пример:

#include <iostream>

namespace CL { // пространство
    int var = 0;
}

using namespace CL; // отбрасываем префикс CL

int main() {
    var = 1; // используем переменную var

    return 0;
}

Как видите, использовать данную конструкцию проще простого. Я думаю тут даже объяснять ничего не нужно. Если вам что-то непонятно, почитайте текст выше. Там все подробно написано.

Вывод

Если вы работаете над проектом не одни, то мы вам конечно же советуем использовать пространство имен. Это ачивка позволит вам быстрей развивать ваш проект. Вам больше не придется каждый раз спрашивать у своих напарников создавали ли они такую-то переменную.

Если же вы работаете один и уверены, что в будущем над этим проектом работать будете только вы, то использовать пространство времен необязательно.

Упражнение

Чтобы потренироваться, попробуйте не использовать using namespace std. Также создайте несколько собственных пространств имен. Так вы сможете довести до автоматизма написание подобных блоков кода.

Спасибо за внимание!

« Функции в C++

Очередь в C++ »

Обсуждение