- Простір імен забезпечує простір, де ми можемо визначити або оголосити ідентифікатор, тобто змінну, метод, класи.
- Використовуючи простір імен, ви можете визначити простір або контекст, у якому визначаються ідентифікатори, наприклад змінна, метод, класи. По суті, простір імен визначає область.
Перевага простору імен для уникнення зіткнення імен.
- Наприклад, ви можете писати якийсь код, який має функцію під назвою xyz(), і є інша доступна бібліотека, яка також має ту саму функцію xyz(). Тепер компілятор не може дізнатися, яку версію функції xyz() ви маєте на увазі у своєму коді.
- Простір імен призначений для подолання цієї труднощі та використовується як додаткова інформація для розрізнення подібних функцій, класів, змінних тощо з однаковими іменами, доступними в різних бібліотеках.
- Найкращим прикладом простору імен є стандартна бібліотека C++ (std), де оголошено всі класи, методи та шаблони. Тому під час написання програми на C++ ми зазвичай включаємо директиву using namespace std;
Визначення простору імен:
- Визначення простору імен починається з ключового слова namespace, за яким слідує ім’я простору імен таким чином:
namespace namespace_name { // code declarations i.e. variable (int a;) method (void add();) classes ( class student{};) }> - Слід зазначити, що після закриваючої дужки немає крапки з комою (;).
- Щоб викликати версію функції або змінної з підтримкою простору імен, додайте перед назвою простору імен наступним чином:
- назва простору імен: :код; // код може бути змінною, функцією або класом.
Директива використання:
- Ви також можете уникнути додавання перед просторів імен за допомогою директиви using namespace. Ця директива повідомляє компілятору, що подальший код використовує імена у вказаному просторі імен.
- Таким чином, простір імен мається на увазі для наступного коду:
C++
#include> using> namespace> std;> // first name space> namespace> first_space> {> >void> func()> >{> >cout <<>'Inside first_space'> << endl;> >}> }> // second name space> namespace> second_space> {> >void> func()> >{> >cout <<>'Inside second_space'> << endl;> >}> }> using> namespace> first_space;> int> main ()> {> >// This calls function from first name space.> >func();> >return> 0;> }> |
>
>Вихід
Inside first_space>
- Імена, введені в директиві using, підкоряються звичайним правилам області видимості. Ім’я видно від точки використання директиви до кінця області, в якій директива знайдена. Сутності з однаковою назвою, визначені у зовнішній області, приховані.
Вкладені простори імен:
- Простори імен можуть бути вкладеними, де ви можете визначити один простір імен всередині іншого простору імен наступним чином:
SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }> Ви можете отримати доступ до членів вкладеного простору імен за допомогою таких операторів розділення:
// для доступу до членів namespace_name2
використання простору імен namespace_name1::namespace_name2;
// для доступу до членів namespace_name1
використання простору імен namespace_name1;
У наведених вище операторах, якщо ви використовуєте namespace_name1, це зробить елементи namespace_name2 доступними в області таким чином:
C++
#include> using> namespace> std;> // first name space> namespace> first_space> {> >void> func()> >{> >cout <<>'Inside first_space'> << endl;> >}> >// second name space> >namespace> second_space> >{> >void> func()> >{> >cout <<>'Inside second_space'> << endl;> >}> >}> }> using> namespace> first_space::second_space;> int> main ()> {> >// This calls function from second name space.> >func();> > >return> 0;> }> |
>
>Вихід
Inside second_space>
Давайте подивимося, як простір імен охоплює сутності, включаючи змінні та функції:
C++
#include> using> namespace> std;> // first name space> namespace> first_space> {> >void> func()> >{> >cout <<>'Inside first_space'> << endl;> >}> }> // second name space> namespace> second_space> {> >void> func()> >{> >cout <<>'Inside second_space'> << endl;> >}> }> int> main ()> {> >// Calls function from first name space.> >first_space :: func();> >// Calls function from second name space.> >second_space :: func();> >return> 0;> }> |
>
>Вихід
Inside first_space Inside second_space>
Розглянемо таку програму C++:
CPP
// A program to demonstrate need of namespace> int> main()> {> >int> value;> >value = 0;> >double> value;>// Error here> >value = 0.0;> }> |
історія версій android
>
>
Вихід:
Compiler Error: 'value' has a previous declaration as 'int value'>
У кожній області ім’я може представляти лише одну сутність. Отже, в одній області не може бути двох змінних з однаковими іменами. Використовуючи простори імен, ми можемо створити дві змінні або функції-члени з однаковими іменами.
CPP
// Here we can see that more than one variables> // are being used without reporting any error.> // That is because they are declared in the> // different namespaces and scopes.> #include> using> namespace> std;> // Variable created inside namespace> namespace> first {> int> val = 500;> }> // Global variable> int> val = 100;> int> main()> {> >// Local variable> >int> val = 200;> >// These variables can be accessed from> >// outside the namespace using the scope> >// operator ::> >cout << first::val <<>'
'>;> >return> 0;> }> |
>
>Вихід
500>
Визначення та створення: Простори імен дозволяють нам групувати іменовані сутності, які б інакше мали глобальний масштаб у вужчі рамки, надаючи їм область простору імен . Це дозволяє організовувати елементи програм у різні логічні області, на які посилаються імена. Простори імен забезпечують простір, де ми можемо визначити або оголосити ідентифікатори, тобто імена змінних, методів, класів тощо.
- Простір імен — це функція, додана в C++, але не присутня в C.
- Простір імен — це декларативна область, яка забезпечує область ідентифікаторів (імен функцій, змінних або інших визначених користувачем типів даних) у ній.
- Допускається кілька блоків простору імен з однаковою назвою. Усі оголошення в цих блоках оголошуються в названій області.
Визначення простору імен починається з ключового слова простір імен за якою слідує ім’я простору імен таким чином:
namespace namespace_name { int x, y; // code declarations where // x and y are declared in // namespace_name's scope }> - Оголошення простору імен з’являються лише в глобальній області видимості.
- Оголошення простору імен можуть бути вкладені в інший простір імен.
- Оголошення простору імен не мають специфікаторів доступу (публічного чи приватного).
- Немає необхідності давати крапку з комою після закриваючої фігурної дужки визначення простору імен.
- Ми можемо розділити визначення простору імен на кілька одиниць.
Визначення простору імен:
Визначення простору імен починається з ключового слова namespace, за яким слідує ім’я простору імен таким чином:
C++
namespace> namespace_name{> >// code declarations i.e. variable (int a;)> >method (>void> add();)> >classes (>class> student{};)> }> |
>
>
Слід зазначити, що після закриваючої дужки немає крапки з комою (;).
Щоб викликати версію функції або змінної з підтримкою простору імен, додайте перед назвою простору імен наступним чином:
назва простору імен: :код; // код може бути змінною, функцією або класом.
C++
// Let us see how namespace scope the entities including variable and functions:> #include> using> namespace> std;> // first name space> namespace> first_space> {> >void> func()> >{> >cout <<>'Inside first_space'> << endl;> >}> }> // second name space> namespace> second_space> {> >void> func()> >{> >cout <<>'Inside second_space'> << endl;> >}> }> int> main ()> {> >// Calls function from first name space.> >first_space::func();> >// Calls function from second name space.> >second_space::func();> >return> 0;> }> // If we compile and run above code, this would produce the following result:> // Inside first_space> // Inside second_space> |
>
>Вихід
Inside first_space Inside second_space>
Директива використання:
Ви можете уникнути додавання просторів імен наперед за допомогою директиви using namespace. Ця директива повідомляє компілятору, що подальший код використовує імена у вказаному просторі імен. Таким чином, простір імен мається на увазі для наступного коду:
C++
#include> using> namespace> std;> // first name space> namespace> first_space> {> >void> func()> >{> >cout <<>'Inside first_space'> << endl;> >}> }> // second name space> namespace> second_space> {> >void> func()> >{> >cout <<>'Inside second_space'> << endl;> >}> }> using> namespace> first_space;> int> main ()> {> >// This calls function from first name space.> >func();> >return> 0;> }> // If we compile and run above code, this would produce the following result:> // Inside first_space> |
>
>Вихід
Inside first_space>
Замість доступу до всього простору імен інший варіант (відомий як використовуючи декларація) для доступу до певного елемента в просторі імен. Наприклад, якщо єдиною частиною простору імен std, яку ви збираєтеся використовувати, є cout, ви можете посилатися на неї так:
використання std::cout;
Подальший код може посилатися на cout без додавання простору імен, але інші елементи в просторі імен std все одно повинні бути явними, як показано нижче:
C++
#include> using> std::cout;> int> main ()> {> >cout <<>'std::endl is used with std!'> << std::endl;> >return> 0;> }> |
>
>Вихід
std::endl is used with std!>
Імена, введені в директиві using, підкоряються звичайним правилам області видимості, тобто вони видимі з моменту появи директиви using до кінця області видимості, в якій директива знайдена. Сутності з однаковою назвою, визначені у зовнішній області, приховані.
C++
// Creating namespaces> #include> using> namespace> std;> namespace> ns1 {> int> value() {>return> 5; }> }>// namespace ns1> namespace> ns2 {> const> double> x = 100;> double> value() {>return> 2 * x; }> }>// namespace ns2> int> main()> {> >// Access value function within ns1> >cout << ns1::value() <<>'
'>;> >// Access value function within ns2> >cout << ns2::value() <<>'
'>;> >// Access variable x directly> >cout << ns2::x <<>'
'>;> >return> 0;> }> |
>
>
Вихід:
сторінки сервера java
5 200 100>
Класи та простір імен: Нижче наведено простий спосіб створення класів у просторі імен:
C++
// A C++ program to demonstrate use of class> // in a namespace> #include> using> namespace> std;> namespace> ns> {> >// A Class in a namespace> >class> geek> >{> >public>:> >void> display()> >{> >cout<<>'ns::geek::display()'>< } }; } int main() { // Creating Object of geek Class ns::geek obj; obj.display(); return 0; }> |
>
>Вихід
ns::geek::display()>
Клас також може бути оголошений усередині простору імен і визначений поза простором імен використовуючи такий синтаксис:
CPP
// A C++ program to demonstrate use of class> // in a namespace> #include> using> namespace> std;> namespace> ns {> // Only declaring class here> class> geek;> }>// namespace ns> // Defining class outside> class> ns::geek {> public>:> >void> display() { cout <<>'ns::geek::display()
'>; }> };> int> main()> {> >// Creating Object of geek Class> >ns::geek obj;> >obj.display();> >return> 0;> }> |
>
>Вихід
ns::geek::display()>
Ми також можемо визначати методи поза простором імен . Нижче наведено приклад коду:
C++
// A C++ code to demonstrate that we can define> // methods outside namespace.> #include> using> namespace> std;> // Creating a namespace> namespace> ns {> void> display();> class> geek {> public>:> >void> display();> };> }>// namespace ns> // Defining methods of namespace> void> ns::geek::display()> {> >cout <<>'ns::geek::display()
'>;> }> void> ns::display() { cout <<>'ns::display()
'>; }> // Driver code> int> main()> {> >ns::geek obj;> >ns::display();> >obj.display();> >return> 0;> }> |
>
>
Вихід:
ns::display() ns::geek::display():>
Вкладені простори імен:
Простори імен можуть бути вкладеними, тобто ви можете визначити один простір імен в іншому просторі імен наступним чином:
C++
алфавіт і цифри
namespace> namespace_name1 {> >// code declarations> >namespace> namespace_name2 {> >// code declarations> >}> }> |
>
>
Ви можете отримати доступ до членів вкладеного простору імен за допомогою оператора дозволу (::) наступним чином:
C++
// to access members of namespace_name2> using> namespace> namespace_name1::namespace_name2;> // to access members of namespace:name1> using> namespace> namespace_name1;> |
>
>
У наведених вище операторах, якщо ви використовуєте namespace_name1, це зробить елементи namespace_name2 доступними в області таким чином:
C++
#include> using> namespace> std;> // first name space> namespace> first_space> {> >void> func()> >{> >cout <<>'Inside first_space'> << endl;> >}> >// second name space> >namespace> second_space> >{> >void> func()> >{> >cout <<>'Inside second_space'> << endl;> >}> >}> }> using> namespace> first_space::second_space;> int> main ()> {> > >// This calls function from second name space.> >func();> > >return> 0;> }> // If we compile and run above code, this would produce the following result:> // Inside second_space> |
>
>Вихід
Inside second_space>
Простір імен забезпечує перевагу уникнення конфліктів імен: -
Наприклад, ви можете писати якийсь код, який має функцію під назвою xyz(), і у вашому коді є інша бібліотека, яка також має таку саму функцію xyz(). Тепер компілятор не може дізнатися, яку версію функції xyz() ви маєте на увазі у своєму коді.
Простір імен призначений для подолання цієї труднощі та використовується як додаткова інформація для розрізнення подібних функцій, класів, змінних тощо з однаковими іменами, доступними в різних бібліотеках.
Найкращим прикладом простору імен є стандартна бібліотека C++ (std), де оголошено всі класи, методи та шаблони. Тому під час написання програми на C++ ми зазвичай включаємо директиву
використання простору імен std;
простір імен у C++ | Набір 2 (розширення простору імен і безіменний простір імен) Простір імен у C++ | Набір 3 (Доступ, створення заголовка, вкладення та псевдоніми) Чи можна простори імен вкладати в C++? довідка : http://www.cplusplus.com/doc/tutorial/namespaces/