logo

Простір імен у C++ | Набір 1 (введення)

  • Простір імен забезпечує простір, де ми можемо визначити або оголосити ідентифікатор, тобто змінну, метод, класи.
  • Використовуючи простір імен, ви можете визначити простір або контекст, у якому визначаються ідентифікатори, наприклад змінна, метод, класи. По суті, простір імен визначає область.

Перевага простору імен для уникнення зіткнення імен.

  • Наприклад, ви можете писати якийсь код, який має функцію під назвою 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/