Пространства имен
Использование пространств имен , позволяет избежать конфликтов имен при работе с большим количеством библиотек. Используется ключевое слово namespace. Одним из часто встречающихся примеров является пространство std.
Добавим в проект два заголовочных файла int.h и str.h.
Содержание int.h
namespace classint
{
class A
{
public:
int Get()
{
return 100;
}
};
}
Содержание str.h
namespace classstr
{
class A
{
public:
char *Get()
{
return "one hundred";
}
};
}
Подключим эти библиотеки в проект
#include "int.h"
#include "str.h"
Здесь мы попадаем в ситуацию, когда при создании объекта класса А, компилятор не знает от какого именно класса должен быть создан объект. Нам на выручку приходят пространства имен.
void main()
{
classint::A i;
cout<<i.Get()<<endl;
classstr::A s;
cout<<s.Get()<<endl;
_getch();
}
Указывая имя пространства имен, мы можем компилятору объяснить от какого из классов мы ходим породить объект.
Оператор using расширяет зону видимости объектов пространств имен, тогда становится возможным использовать их без двойного двоеточия. При условии, что имена этих объектов не пересеваются. Для наглядности примера, изменим имя класса в библиотеке str.h на class B.
using namespace std;
using namespace classint;
using namespace classstr;
void main()
{
A i;
cout<<i.Get()<<endl;
B s;
cout<<s.Get()<<endl;
_getch();
}
Если мы к примеру исключим строчку “using namespace std;”, то мы должны будем использовать не cout, а std::cout.
Для пространств имен поддерживаются спецификаторы доступа (public и private). Спецификатор доступа должен предшествовать каждому логическому узлу кода.
namespace classint
{
private class A
{
public:
int Get()
{
return 100;
}
};
}
Пространства имен могут быть вложенными. Для перехода во вложенное пространство нужно так же использовать двойное двоеточие.
namespace A
{
…
namespace B
{
…class My {};
}
}
A::B::My m;
Видимость во вложенные пространства имен тоже можно расширить
using namespace A::B;
void main()
{
My m;
}