Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lutsik_Yu_A_Obektno_orientir_programmir_na_yaz.pdf
Скачиваний:
64
Добавлен:
11.05.2015
Размер:
4.33 Mб
Скачать

cout << "\n адрес переменных i = "<<&i<<"

j = "<<&j;

 

cout << "\n значение

i = "<<i<<" j = "<<j;

 

 

j=5;

 

//

 

 

 

 

cout << "\n адрес переменных i = "<<&i<<"

j = "<<&j;

 

cout << "\n значение

i = "<<i<<" j = "<<j;

 

 

return 0;

 

 

 

 

 

 

}

 

 

 

 

 

 

В результате работы программы будет получено:

 

адрес переменных i = 0xадрес1

j = 0xадрес2

 

 

значение

i = 1

j = 1

 

 

 

 

адрес переменных i = 0xадрес1

j = 0xадрес2

 

 

значение

i =5

j = 5

 

 

 

 

В этом случае компилятор создает временный объект j, которомуРпри-

 

 

 

 

 

У

сваивается адрес ранее созданного объекта i. Далее j может быть использовано

как второе имя i.

 

 

 

 

Г

И

 

 

 

 

 

3.13. Пространства имен

При совпадении имен разных элементов в одной области действия часто

 

 

 

а

возникает конфликт имен. Наиболее часто это возникает при использовании

различных пакетов библиотек, содержащих, н примерБ, одноименные классы.

 

 

к

Пространства имен используются для разделения глобального пространства

имен, что позволяет уменьшить колич

ес

 

тво онфликтов.

т

 

 

3.13.1. Определение пространс

ва им н

Синтаксис пространства имен неко орым образом напоминает синтаксис структур и классов. После ключевого слова namespace следует необязательное

имя пространства имен, затем писывае ся пространство имен, заключенное в

фигурные скобки.

 

и

л

о

namespace NAME

{ int a;

б

 

 

doudle b;

 

 

 

и

 

 

 

char *fun(char *,int);

class CLS

 

 

 

Б

 

 

 

 

{ . . .

 

 

 

public:

. . .

}

}

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

NAME::b=2;

NAME:: fun(str,NAME:: a);

Внутри пространства имен можно поместить группу объявлений классов,

58

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

Использование безымянного пространства имен (отсутствует имя про- странства имен) позволяет определить уникальность объявленных в нем иден- тификаторов с областью видимости в пределах файла.

Контексты пространства имен могут быть вложены.

namespace NAME1

 

 

{ int a;

 

 

namespace NAME2

 

И

}

 

{ int a;

 

 

int fun1(){return NAME1:: a}; // возвращается значениеРпервого a

int fun2(){return a};

 

У

 

// возвращается значение второго a

}

 

 

NAME1::NAME2::fun1();

// вызов функции

Если в каком-то месте программы интенсивноГиспользуется некоторый

 

 

а

контекст и все имена уникальны по отношению к нему, то можно сократить

полные имена, объявив контекст текущим сБпомощью оператора using.

 

ак

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

ое

 

можно использовать ключев

слово using для упрощения доступа к ним. Клю-

чевое слово using использу тся и

директива, и для объявления. Синтаксис

слова using определяет, являе ся ли оно директивой или объявлением.

3.13.2. Ключев е сл во using как директива

и

 

 

Инструкц я usingтnamespace имя позволяет предоставить все имена,

объявленные в пространствео

имен,

для доступа в текущей области действия.

Эта инструкц я называется директивой using. Это позволит обращаться к этим

именам

ез указания их полного имени, включающего название пространства

имен.

л

#include <iostream>

б

using namespace std;

Биnamespace NAME

{int n1=1; int n2=2;

}

// int n1; приводит к неоднозначности в main для переменной n1

int main()

 

{ NAME::n1=3;

 

// n1=3;

// error 'n1' : undeclared identifier

59

 

// n2=4;

// error 'n2' : undeclared identifier

 

 

 

using namespace NAME;

// далее n1 и n2 доступны

 

 

n2=4;

 

 

 

 

 

cout << n1 <<" "<< n2 << endl;

// результат 3

4

 

 

{ n1=5;

 

 

 

 

 

n2=6;

 

 

 

 

 

cout << n1 <<" "<< n2 << endl; // результат

5 6

 

 

}

 

 

 

 

 

return 0;

 

 

 

Р

}

 

 

 

 

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

 

3

4

 

 

 

5

6

 

 

 

 

 

 

И

Область действия директивы using распространяется на блок, в котором

она использована, и на все вложенные блоки.

Г

 

 

 

 

Б

 

Если одно из имен относится к глобальной области, аУдругое объявлено

внутри пространства имен, то возникает неоднозначность. Это проявится только

при использовании этого имени, а не при объявлении.

#include <iostream>

а

using namespace std;

к

В данном фрагменте стандартный заголовочный файл библиотеки вво- да/вывода iostream не имеет расшир ниясе. В содержимое этого файла опреде-

ляется как часть namespace std.

ность. Основная проблема, к руютпризвана решить такая конструкция это не-

Для достижения переносимос и р комендуется использовать директиву

using, хотя и существуют компиля оры, не поддерживающие данную возмож-

поддерживают вариантцияс подключением файлов стандартной библиотеки с рас-

зависимость от ограничен на длину имени файла в различных операционных системах. Более тогол, комп ляторы Microsoft последних версий вообще не

ширением .h, тб.е. конструк #include <iostream.h> в Visual C++ 7.1 не компи-

лируется.

Б3.13.3.иКлючевое слово using как объявление

Объявлен е using имя::член подобно директиве, при этом оно обеспечи- вает более подробный уровень управления. Обычно using используется для объ- явления некоторого имени (из пространства имен) как принадлежащего теку- щей области действия (блоку).

#include <iostream> using namespace std; namespace NAME

{int n1=1; int n2=2;

60

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]