Zaochniki / 08_ns
.pdf
Неименованные (безымянные) пространства им¼н
Сокрытие реализации на уровне файла
Ôàéë mylib.h
namespace |
{ |
// безымянное пространство им¼н |
||
c l a s s A |
{ |
} ; |
||
void f u n x x ( ) ; |
||||
i n t |
z z z ; |
|
|
|
} ; |
|
|
|
|
// < здесь |
неявно срабатывает u s i n g namespace |
|||
A : : A( ) |
|
|
|
|
{} |
|
|
|
|
void f u n x x ( ) |
|
|||
|
|
|
|
|
{ |
|
|
|
|
z z z |
= 0 ; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
За пределами этого файла имена A , funxx , zzz не видны.
Пространства им¼н
Свойства пространств им¼н
Отличия от классов
Пространства им¼н открыты
В отличие от классов, в пространствах им¼н нет модификаторов public, private, protected. Все имена из именованных пространств им¼н пространств им¼н доступны снаружи.
Пространства им¼н пополняемы
В любой момент пространство им¼н можно пополнить новыми определениями.
namespace A {
i n t x ;
} ;
namespace A {
i n t y ;
} ;
Пространства им¼н
Псевдонимы пространств им¼н
Использование коротких им¼н вместо длинных
Для избежания конфликта им¼н среди самих пространств им¼н желательно использовать длинные имена. Пользоваться длинными именами неудобно.
namespace my_lovely_graph_lib_v20 { c l a s s Window { } ; / . . . . . . . /
} ;
namespace MGL = my_lovely_graph_lib_v20 ;
//теперь вместо my_lovely_graph_lib_v20
//можно использовать MGL
MGL : : Window w ;
Нельзя пополнять пространства им¼н, используя псевдонимы.
Пространства им¼н
Преимущества и недостатки пространств им¼н
Недостатки
потребовался новый синтаксис языка;
язык стал сложнее в изучении.
Преимущества
имена в программе можно разделить на области применения;
если не конфликта им¼н, при помощи using можно использовать короткую форму записи;
при необходимости конфликт им¼н разрешается явно;
можно использовать для сокрытия реализации, не находящейся в классе;
пользователь контролирует, каким образом используются имена в программе.
Пространства им¼н
Пространства им¼н и библиотеки
Во избежание конфликта им¼н современные библиотеки C++ помещаются в собственные пространства им¼н.
Стандартная библиотека C++ находится в пространстве им¼нstd .
Для совместимости в языком C, стандартная библиотека C++ состоит из двух частей:
старая часть, которая практически совпадает со стандартной библиотекой языка С. Доступны такие функции как printf, open, sin, . . .
современной, объектно-ориентированной и шаблонной части.
Пространства им¼н
Стандартная библиотека C++
Использование современной части
Современная часть библиотеки C++ может использоваться только через пространство им¼н std .
#i n c l u d e |
<i o s t r e a m > // включение заголовка |
||
#i n c l u d e <s t r i n g > |
|||
void |
f ( ) |
|
|
{ |
|
|
|
s t d : : s t r i n g |
s = "ABCDE" ; |
||
s t d : : cout << s << s t d : : e n d l ; |
|||
} |
|
|
|
|
|
||
using |
namespace s t d ; |
||
void g ( ) |
|
|
|
{ |
|
|
|
s t r i n g |
s = |
"ABCDE" ; |
|
|
|
|
|
cout << s << e n d l ;
}
Пространства им¼н
Стандартная библиотека C++
Использование унаследованной части (1)
Унаследованная часть библиотеки C++ может использоваться так, как использовалась в языке С. При этом включаются привычные заголовочные файлы, и импорт им¼н из std происходит автоматически.
#i n c l u d e <s t d i o . h> #i n c l u d e < s t r i n g . h>
void f ( )
{
const char s = "ABCDE" ;
i n t i = s t r l e n ( s ) ;
p r i n t f ( " s= %s , i= %d\n" , s , i ) ;
}
Пространства им¼н
Стандартная библиотека C++
Использование унаследованной части (2)
Унаследованная часть библиотеки C++ может использоваться так же, как и современная. При этом от имени заголовочного файла отбрасывается суффикс .h и добавляется префикс c .
#i n c l u d e |
<c s t d i o > |
#i n c l u d e |
<c s t r i n g > |
void f ( ) |
|
|
{ |
|
|
const char s |
= "ABCDE" ; |
|
i n t i = s t d : : s t r l e n ( s ) ; |
|
|
s t d : : p r i n t f ( |
" s= %s , i= %d\n" , |
s , i ) ; |
} |
|
|
using namespace |
s t d ; |
|
void g ( ) |
|
|
{ |
|
|
const char s |
= "ABCDE" ; |
|
i n t i = s t r l e n ( s ) ; |
|
|
p r i n t f ( " s= %s , i= %d\n" , s , i |
) ; |
|
} |
|
|
|
|
|
Пространства им¼н
