C ++

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

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

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

#include
използване на пространство от имена std;
int varId = 5;
float varId = 2.3;
int main ()

връщане 0;

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

#include
използване на пространство от имена std;
пространство от имена NA

int varId = 5;

пространство на имената NB

float varId = 2.3;

int main ()

Cout << NA::varId << '\n';
Cout << NB::varId << '\n';
връщане 0;

Резултатът е както следва:

5
2.3

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

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

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

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

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

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

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

#include
използване на пространство от имена std;
int ident = 55;
float ident = 12.17;
int main ()

връщане 0;

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

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

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

#include
използване на пространство от имена std;
пространство от имена NA

int varInt = 6;
float flt;

пространство на имената NB

int varInt = 7;
float flt;

int main ()

Cout << NA::varInt << '\n';
Cout << NB::varInt << '\n';
NA :: flt = 2.5;
NB :: flt = 4.8;
Cout << NA::flt << '\n';
Cout << NB::flt << '\n';
връщане 0;

Резултатът е:

6
7
2.5
4.8

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

Имайте предвид, че потребителското пространство от имена е вложено пространство от имена за глобалното пространство от имена.

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

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

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

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

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

#include
използване на пространство от имена std;
пространство на имената NB

int varInt = 7;
int func ()

връщане varInt;


int fn ()

използване на пространство от имена NB;
int myVar2 = func ();
// други обекти и функции от NB следват.
върнете myVar2;

int myVar3 = NB :: func ();
int main ()

Cout << fn() << " << myVar3 << '\n';
връщане 0;

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

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

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

int myVar3 = NB :: func ();

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

#include
използване на пространство от имена std;
пространство от имена NA

int varInt = 6;
int func ()

връщане varInt;


пространство на имената NB

int varInt = 7;
int func ()

връщане varInt;


използване на пространство от имена NA;
int myVar0 = varInt;
// други обекти и функции от :: и NB следват.
int fn ()

int myVar1 = varInt;
използване на пространство от имена NB;
int myVar2 = NB :: func ();
// други обекти и функции от NB следват до края на този обхват.
върнете myVar1 + myVar2;

// Следват само обекти и функции от :: и NB.
int myVar3 = NB :: func ();
int main ()

Cout << myVar0 << " << fn() << " << myVar3 << '\n';
връщане 0;

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

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

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

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

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

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

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

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

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

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

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

#include
използване на пространство от имена std;
пространство от имена A

int i = 1;
пространство от имена B

int i = 2;
пространство от имена C

int i = 3;



int main ()

Cout << A::i << " << A::B::i << " << A::B::C::i << '\n';
връщане 0;

Резултатът е:

1 2 3

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

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

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

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

#include
използване на пространство от имена std;

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

Заключение

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

Chrys

Урок за OpenTTD
OpenTTD е една от най-популярните бизнес симулационни игри там. В тази игра трябва да създадете прекрасен транспортен бизнес. Въпреки това, ще започне...
SuperTuxKart за Linux
SuperTuxKart е страхотно заглавие, създадено да ви предостави безплатно изживяването на Mario Kart във вашата Linux система. Играта е доста предизвика...
Урок за битка за Уеснот
Битката за Уеснот е една от най-популярните стратегически игри с отворен код, които можете да играете по това време. Тази игра не само се разработва о...