C ++ пространство на имената

C Namespace



Пространството от имена в C ++ е обобщен обхват. Декларацията му започва с запазената дума, пространство от имена, последвано от име по избор на програмиста и след това блокът в скоби. Блокът съдържа основни декларации и/или дефиниции на C ++ обекти, функции и други обекти.

Помислете за следните две скаларни изявления в глобален обхват в следната програма:







#включва
използвайки пространство за имена std;

intvarId= 5;
плувамvarId= 2.3;

intглавен()
{

връщане 0;
}

Опитът за компилиране на тази програма води до грешка при компилиране. Има две променливи със същото име, varId . Въпреки че те са две различни променливи от два различни типа, int и плувам , компилаторът отхвърля двете декларации, защото са със същото име. Следващата програма решава този проблем, като декларира променливите със същото име в два различни обобщени обхвата:



#включва
използвайки пространство за имена std;

пространство на имената NA
{
intvarId= 5;
}

пространство на имената NB
{
плувамvarId= 2.3;
}

intглавен()
{
цена<<NA::varId << 'н';
цена<<NB::varId << 'н';

връщане 0;
}

Изходът е както следва:



5
2.3

В горната програма има две пространства с имена: NA , която има определението за цяло число, и NB , който има дефиниция на поплавък, но със същото име като цяло число за NA. И накрая, когато програмата се изпълнява, се използва същото име за две различни променливи. Имайте предвид, че за достъп до едно и също име на две различни променливи трябва да се използва конкретното име за пространството от имена, последвано от общия идентификатор. Името на пространството на имената и общият идентификатор са разделени от оператора за разрешаване на обхвата, :: . Името на пространствата с имена ще разграничава обектите.





Тази статия обхваща основната концепция за пространство от имена и използването му в езика за програмиране на C ++. За да следвате тази статия, трябва да имате основни познания по езика C ++. Трябва също да имате познания за обхвата на C ++, въпреки че накратко е обяснено в тази статия. За да научите повече за обхвата на C ++, потърсете фразата, Обхват в C ++ (без кавички) в полето за търсене на всяка уеб страница на linuxhint.com и натиснете Enter. Това ще ви отведе до статията, написана от този автор.

Съдържание на статията

Какво е пространство на имената?

Декларативен регион е най -голямата част от програма, в която името на обект (променлива) е валидно. Този регион се нарича обхват. Пространството от имена в C ++ е обобщен обхват, чиято основна цел е да разрешава конфликти на имена. Пространството с имена има основни декларации и/или дефиниции на обекти.



Глобалното пространство на имената и неговият проблем

Глобалното пространство от имена е глобалният обхват. Помислете за следната кратка програма:

#включва
използвайки пространство за имена std;

intидентичен= 55;
плувамидентичен= 12.17;

intглавен()
{

връщане 0;
}

В горната програма има две променливи, и двете се наричат идентичен . Тези променливи са в глобалния обхват; тоест те са в глобалното пространство от имена. Опитът за компилиране на тази програма ще се провали със съобщение за грешка. Глобалният обхват не приема повече от една променлива със същото име, така че има нужда от персонализирано пространство от имена.

Персонализирано пространство на имената

Пространството от имена няма само едно име. Вместо това пространството с имена има набор от имена, за да се избегне конфликт с други набори от имена. За да избегнете конфликт по -долу в кода, предхождайте всяко име с името на пространството от имена и :: . Следващата програма илюстрира това, използвайки две персонализирани пространства с имена:

#включва
използвайки пространство за имена std;

пространство на имената NA
{
intвариант= 6;
плувамflt;
}

пространство на имената NB
{
intвариант= 7;
плувамflt;
}

intглавен()
{
цена<<NA::вариант << 'н';
цена<<NB::вариант << 'н';
NA::flt = 2.5;
NB::flt = 4.8;
цена<<NA::flt << 'н';
цена<<NB::flt << 'н';

връщане 0;
}

Изходът е:

6
7
2.5
4.8

Обърнете внимание, че имената NA :: flt и NB :: flt в крайна сметка са дефинирани в main () функция. C ++ не позволява такова определение в глобалния обхват.

Обърнете внимание, че персонализираното пространство от имена е вложено пространство за имена за глобалното пространство от имена.

Директивата за използването

За да избегнете въвеждането на пространство от имена :: име през цялото време, вместо само име след деклариране на пространството от имена, можете да използвате използвайки директива. Синтаксисът за използване на използвайки директивата е както следва:

използвайки пространство от имена Namespace_name;

The използвайки директивата не е препроцесорна директива, затова завършва с точка и запетая (;).

Следващата програма илюстрира използването на използвайки директива и още:

#включва
използвайки пространство за имена std;

пространство на имената NB
{
intвариант= 7;
intфункция()
{
връщаневариант;
}
}

intfn()
{
използвайки пространство от имена NB;
intmyVar2=функция();
// следват други обекти и функции от NB.
връщанеmyVar2;
}

intmyVar3=NB::функция();

intглавен()
{
цена<<fn() << '' <<myVar3<< 'н';

връщане 0;
}

Изходът на тази програма е 7 7 . Терминът използване на пространство от имена NB; е поставен в началото на fn () определение. The func () от пространството на имената на NB се извиква точно под това, без да предхожда с NB :: .

Променлива, декларирана в глобалния обхват (глобално пространство от имена), се вижда от точката на деклариране до края на файла. Вижда се и в вложените пространства на имена (вложени области), като например вложените fn () обхват на функцията по -горе. The използвайки директивата присъединява своето пространство от имена от позицията, на която е поставена, до края на обхвата, в който е поставена.

Името func () от пространството на имената на NB не може да се види под fn () определение, защото използване на пространство от имена NB; беше поставен в обхвата на функцията (блок). При това условие да се използва func () извън блока на пространството от имена NB (обхват), той трябва да бъде предшестван от NB :: , както в следното изявление:

intmyVar3=NB::функция();

The използвайки директивата свързва своето пространство с имена с външното вложено пространство от имена от позицията, на която е поставено, до края на външното вложено пространство от имена. В следващата програма пространството на имената NA се свързва с глобалното пространство от имена. След това двете пространства на имената се разширяват в fn () пространство за имена на дефиниция на функции, в което те са свързани с пространството на имената на NB. Пространството от имена на NB завършва в края на fn () дефиниция на функция, а двете предишни пространства на имена продължават до края на файла (прочетете кода).

#включва
използвайки пространство за имена std;

пространство на имената NA
{
intвариант= 6;
intфункция()
{
връщаневариант;
}

}

пространство на имената NB
{
intвариант= 7;
intфункция()
{
връщаневариант;
}
}

използвайки пространство от имена NA;
intmyVar0=вариант;
// следват други обекти и функции от :: и NB.

intfn()
{
intmyVar1=вариант;
използвайки пространство от имена NB;
intmyVar2=NB::функция();
// следват други обекти и функции от NB до края на този обхват.
връщанеmyVar1+myVar2;
}

// Следват само обекти и функции от :: и NB.

intmyVar3=NB::функция();

intглавен()
{
цена<<myVar0<< '' <<fn() << '' <<myVar3<< 'н';

връщане 0;
}

Изходът е 6, 13, 7 .

Забележка: Глобалното пространство от имена е обозначено с :: , което означава, че няма нищо преди оператора за разрешаване на обхвата, който следва.

Под изявлението, използване на пространство от имена NA; променливи от глобалното и NA пространството на имената могат да се използват без посочване на тяхното източник пространство на имена. Следващото изявление използва вариант от пространството на имената на NA. Глобалният и NA комбинираният регион на пространството от имена се простира до fn () пространство на имената на функции. Така че вариант на първото изявление в fn () обхватът на функцията е от пространството на имената на NA.

Тъй като регионът за глобалните и NA пространства от имена се простира в целия fn () обхват, след int myVar2 = NB :: func (); , всяко име от пространството на имената на NB може да се използва само в fn () обхват, без да го предхождате с NB :: , само ако не се е появил в NA и глобалните пространства на имена (блокове). В противен случай трябва да се предхожда от NB :: . Регионът на комбинираните пространства от имена за NA и глобален продължава под fn () определение и в main () функция до края на файла.

Разширението на пространството от имена на NB започва от int myVar2 = NB :: func (); в fn () блок и завършва в края на fn () дефиниционен блок.

Забележка: Пространствата на имената, чиито региони са свързани, не трябва да имат същото име на променлива в различните им блокове на пространството на имената, тъй като това все още би предизвикало конфликт.

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

Пространството от имена е обхват. Освен глобалното пространство от имена (глобален обхват), всяко пространство от имена трябва да бъде декларирано в блок. Този блок е първата част от евентуално разпределените региони на пространството с имена. С директивата using пространството на имената може да бъде разширено като региони в други области.

За обекти, декларирани в тяло на пространство от имена, се казва, че са членове на пространството с имена, а имената, въведени от тези декларации в декларативната област на пространството от имена, се наричат ​​членове на пространството от имена.

Вложени пространства на имената

Следната програма показва вложени пространства от имена:

#включва
използвайки пространство за имена std;

пространство от имена А
{
inti= 1;
пространство от имена B
{
inti= 2;
пространство на имената C.
{
inti= 3;
}
}
}

intглавен()
{
цена<<ДА СЕ::i << '' <<ДА СЕ::Б::i << '' <<ДА СЕ::Б::° С::i << 'н';

връщане 0;
}

Изходът е:

1 2 3

Забележете, че трите стойности са били достъпни с помощта на оператора за разрешаване на обхвата.

Стандартно пространство на имената

C ++ има библиотека, наречена стандартна библиотека. Имената на обекти, функции и други обекти в тази библиотека са от пространство на имена, наречено стандартно пространство от имена, написано като часа . Стандартната библиотека съдържа подбиблиотеки и една от тези подбиблиотеки е iostream . The iostream библиотеката съдържа обекта цена , който се използва за изпращане на резултати до конзолата (терминала).

Името цена трябва да е в часа пространство на имената. Да използвам iostream с неговите часа пространство на имената, програмата трябва да бъде следната:

#включва
използвайки пространство за имена std;

Обърнете внимание на използването на използвайки директива и часа . Терминът #включва е препроцесорна директива и не завършва с точка и запетая. Той включва файла iostream в позицията на неговата директива.

Заключение

Пространството от имена е обхват. Описанието на пространството от имена (дефиниция) съдържа основни декларации и/или дефиниции на C ++ обекти, функции и други обекти. Извън дефиницията на пространството от имена, името може да бъде достъпно със синтаксиса, namespaceName :: име . Освен глобалното пространство от имена (глобален обхват), всяко пространство от имена трябва да бъде декларирано в блок. Този блок е първата част от евентуално разпределените региони на пространството с имена. С използвайки директива, пространството на имената може да бъде разширено като региони в други области. Пространствата на имената, чиито региони са свързани, не трябва да имат същото име на променлива в различните им блокове на пространството на имената, тъй като това все още би довело до конфликт на имена.

Крис