- •1 Использование описания typedef
- •2 Преобразование типов
- •3 Указатели на функции
- •4 Пример использования указателей на функции
- •5 Области видимости и время жизни объектов
- •6 Пример использования статической локальной переменной
- •Примечание
- •7 Пространства имен
- •9 Подходы к разработке структуры программы
- •8 Заголовочные файлы
- •11 Задания на самостоятельную работу Задание 1
- •Задание 2
Примечание
Иногда для наглядности в случаях проверки переменной х на неравенство нулю пишут if(х != 0)или while(х != 0), хотя это полностью эквивалентно if(х) и while(х) соответственно.
7 Пространства имен
Логическая структура программы отражается с помощью пространств имен. Если некоторые объявления можно объединить по какому-либо критерию, их можно поместить в одно пространство имен. Таким образом реализуется механизм логического группирования. Пространство имен является областью видимости. Его имя может быть использовано в качестве квалификатора в операции разрешения области видимости. В пространство имен обычно заключают набор средств, относящийся к какой-то части программы:
namespace MySpace
{
int k = 10;
void f(int n)
{
k = n;
}
}
Определения объектов, объявленных внутри пространства имен, могут находиться и вне пространства имен:
namespace MySpace
{
int k = 10;
void f(int n);
}
void MySpace::f(int n)
{
k = n;
}
Пространства могут быть вложены одно в другое, но при этом не могут находиться внутри функций или классов. Пространства имен могут быть разбиты на части в пределах одной единицы трансляции.
namespace MySpace
{
int k = 10;
void f(int n);
}
//
namespace MySpace
{
void f(int n)
{
k = n;
}
}
Имена, объявленные и определенные внутри пространства имен, без каких-либо ограничений доступны в пределах этого пространства. Чтобы получить доступ к именам пространства из других частей программы, необходимо использовать синтаксис имя-пространства::имя:
int x = MySpace::k;
Имеется возможность задания псевдонимов для пространств имен, например:
namespace YourSpace = MySpace;
Существуют так называемые безымянные пространства имен, в который помещаются объекты, видимые только в своем файле (единице компиляции). Такие имена имеют так называемое внутреннее связывание.
// файл f1.cpp
namespace
{
int x = 100; // х известно только в f1.cpp
}
// файл f2.cpp
namespace
{
int x = 200; // x известно только в f2.cpp
}
Для того, чтобы все имена пространства можно было использовать без квалификатора, используется using-директива:
using namespace MySpace;
// Свободное использование всех имен пространства
Директива using делает все имена пространства глобальными в пределах данного файла или данного блока.
В отличие от using-директивы, using-объявление применяется к отдельным именам.
using MySpace::k;
using MySpace::f;
// использование f и k без квалификатора
С помощью using-директивы можно объединять пространства имен:
namespace NewSpace
{
using namespace FirstSpace; // using-директива
using namespace SecondSpace; // using-директива
}
Если требуется доступ только к нескольким именам из пространства, можно произвести явный отбор при помощи создания нового пространства и использования using-объявления:
namespace NewSpace
{
using OtherSpace::name1; // using-объявление
using OtherSpace::name2; // using-объявление
}
Имена, указанные с помощью using-объявлений, имеют приоритет по отношению к именам, сделанным доступными при помощи using-директив. Механизм перегрузки функций работает сквозь границы пространств имен. Пространства имен открыты. К ним можно добавлять новые имена в нескольких объявлениях:
namespace FirstSpace
{
// начало
}
namespace SecondSpace
{
// прерывает
}
namespace FirstSpace
{
// продолжение
}
