Namespace имя_пространства

{

//Объявления

}

 

Все, что объявлено в разделе namespace, находится внутри области видимости этого пространства имен.

Рассмотрим пример пространства имен.

namespace MySpace{

int var1;

struct student

{ char name[25];

int kod;

};

int fun1(int a,int b)

{return a+b;}

}

Здесь переменная var1,функция fun1,а такжеструктура student находятсяв области видимости, определеннойпространством имен MySpace.

Для того чтобы обратиться к элементу пространства извне, следует перед его именем указать имя пространства и оператор разрешения области видимости::.

Рассмотрим программу, демонстрирующую применение пространства имен MySpace.

//Листинг 13.1

#include<iostream>

using namespace std;

namespace MySpace{

int var1;

struct student

{ char name[25];

int kod;

};

int fun1(int a,int b)

{return a+b;}

}

int main()

{

setlocale(LC_CTYPE,"Russian");

MySpace::var1=100;

MySpace::student st={"Иванов",12345};

int c=2,g=3;

cout<<"MySpace::fun1="

<<MySpace::fun1(c,g)<<endl;

cout<<"MySpace::var1= "<<MySpace::var1<<endl;

cout<<"Фамилия: "

<<st.name<<" - номер зачетки: "

<<st.kod<<endl;

return 0;

}

Результаты выполнения программы:

MySpace::fun1= 5

MySpace::var1= 100

Фамилия: Иванов - номер зачетки: 12345

 

Отметим, что определению переменной st предшествует квалификатор MySpace. После определения этой переменной к полям структуры обращаемся без квалификатора.

Для того чтобы в программе не использовать квалификаторы и операторы области разрешения видимости, следует применять директиву using, имеющую вид:

using namespace имя_пространства;

using имя_пространства::элемент_пространства;

 

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

Во втором варианте в область видимости включается только конкретный элемент пространства имен.

Переработанный вариант предыдущей программы с использованием оператора using:

//Листинг 13.2

#include<iostream>

using namespace std;

namespace MySpace{

int var1;

struct student

{ char name[25];

int kod;

};

int fun1(int a,int b)

{return a+b;}

}

using namespace MySpace;

int main()

{ setlocale(LC_CTYPE,"Russian");

var1=100;

student st={"Иванов",12345};

int c=2,g=3;

cout<<"MySpace::fun1= "<<fun1(c,g)<<endl;

cout<<"MySpace::var1= "<<var1<<endl;

cout<<"Фамилия: "<<st.name

<<" - номер зачетки: "<<st.kod<<endl;

return 0;}

 

Одно пространство имен не перекрывает другого. Открывая пространство имен, вы просто добавляете его члены к элементам текущей области видимости. Таким образом, в данной программе, кроме глобального пространства имен, доступными оказываются также пространства имен std и MySpace.

Существует особая разновидность пространств имен — неименованное пространство имен (unnamed namespace), позволяющее создавать уникальные идентификаторы, область видимости которых ограничена файлом. Неименованные пространства имен иногда называют безымянными (anonymous namespaces). Их объявление имеет следующий вид:

Namespace

{

//Объявления

}

 

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

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

При физическом разделении программы на модули пространство имен разбивается на части. Но если в разных единицах трансляции объявлено одно и то же пространство имен, оно «склеивается» в единое целое. Именно таким образом определено стандартное пространство имен std. Отметим, что пространство имен можно разделить и внутри одного файла.

Это свойство «склеивания» пространства имен хорошо подходит для организации библиотеки. Исходный код разделяется на две части: интерфейс и реализацию. Интерфейсная часть помещается в отдельный заголовочный файл, а реализация – в другой файл. В клиентском коде подключается только заголовочный файл.

Рассмотрим программу, состоящую из трех файлов.

Содержимое файла myspace.h:

//Листинг 13.3

namespace MySpace

{

const double d=299792.5; //скорость света(км/с)

//прототипы функций

int fun1(int a,int b);

double fun2(double x);

}

Содержимое файла myspace.cpp:

#include"myspace.h"

namespace MySpace

{ //определение функций

int fun1(int a,int b)

{ return a+b;}

double fun2(double x)

{ return x*x*x;}

}

Содержимое файла primer.cpp, в котором содержится клиентский код:

#include<iostream>

#include"myspace.h"

using namespace std;

using namespace MySpace;

int main()

{ //Установка поддержки русского языка в Visual Studio

setlocale(LC_CTYPE,"Russian");

double y=5.;

int c=2,g=3;

cout<<"fun1= "<<fun1(c,g)<<endl;

cout<<"fun2= "<<fun2(y)<<endl;

cout<<"d= "<<d<<endl;

return 0;

}

Результаты выполнения программы:

fun1= 5

fun2= 125

d= 299793

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: