Przestrzeń nazw C++

C Namespace



Przestrzeń nazw w C++ to uogólniony zakres. Jego deklaracja zaczyna się od słowa zastrzeżonego, przestrzeni nazw, po której następuje nazwa wybrana przez programistę, a następnie blok w nawiasach. Blok zawiera podstawowe deklaracje i/lub definicje obiektów, funkcji i innych encji C++.

Rozważ następujące dwie instrukcje skalarne w zasięgu globalnym, w następującym programie:







#włączać
przy użyciu standardowej przestrzeni nazw;

intvarId= 5;
pływakvarId= 2,3;

intGłówny()
{

powrót 0;
}

Próba skompilowania tego programu prowadzi do błędu kompilacji. Istnieją dwie zmienne o tej samej nazwie, varId . Chociaż są to dwie różne zmienne dwóch różnych typów, int oraz pływak , kompilator odrzuca dwie deklaracje, ponieważ mają one tę samą nazwę. Poniższy program rozwiązuje ten problem, deklarując zmienne o tej samej nazwie w dwóch różnych zakresach uogólnionych:



#włączać
przy użyciu standardowej przestrzeni nazw;

przestrzeń nazw NA
{
intvarId= 5;
}

przestrzeń nazw NB
{
pływakvarId= 2,3;
}

intGłówny()
{
koszt<<Nie dotyczy::varId << ' ';
koszt<<NB::varId << ' ';

powrót 0;
}

Dane wyjściowe są następujące:



5
2,3

W powyższym programie istnieją dwie przestrzenie nazw: Nie dotyczy , który ma definicję liczby całkowitej, oraz NB , który ma definicję liczby zmiennoprzecinkowej, ale ma taką samą nazwę jak liczba całkowita dla NA. Ostatecznie, gdy program został uruchomiony, użyto tej samej nazwy dla dwóch różnych zmiennych. Zauważ, że aby uzyskać dostęp do tej samej nazwy dwóch różnych zmiennych, należy użyć konkretnej nazwy przestrzeni nazw, po której następuje wspólny identyfikator. Nazwa przestrzeni nazw i wspólny identyfikator są oddzielone operatorem rozpoznawania zakresu, :: . Nazwa przestrzeni nazw będzie odróżniać obiekty.





W tym artykule omówiono podstawową koncepcję przestrzeni nazw i jej użycie w języku programowania C++. Aby śledzić ten artykuł, powinieneś mieć podstawową wiedzę na temat języka C++. Powinieneś także znać zakres języka C++, chociaż został on pokrótce wyjaśniony w tym artykule. Aby dowiedzieć się więcej o zakresie C++, wyszukaj frazę Zakres w C++ (bez cudzysłowów) w polu wyszukiwania dowolnej strony internetowej linuxhint.com i naciśnij klawisz Enter. Doprowadzi cię to do artykułu napisanego przez tego autora.

Treść artykułu

Co to jest przestrzeń nazw?

Region deklaratywny to największa część programu, w której obowiązuje nazwa encji (zmienna). Ten region nazywa się zakresem. Przestrzeń nazw w C++ to uogólniony zakres, którego głównym celem jest rozwiązywanie konfliktów nazw. Przestrzeń nazw zawiera podstawowe deklaracje i/lub definicje encji.



Globalna przestrzeń nazw i jej problem

Globalna przestrzeń nazw to zasięg globalny. Rozważ następujący krótki program:

#włączać
przy użyciu standardowej przestrzeni nazw;

intident= 55;
pływakident= 12.17;

intGłówny()
{

powrót 0;
}

W powyższym programie istnieją dwie zmienne, obie nazywane ident . Te zmienne mają zasięg globalny; to znaczy, że znajdują się w globalnej przestrzeni nazw. Próba skompilowania tego programu zakończy się niepowodzeniem i wyświetleniem komunikatu o błędzie. Zakres globalny nie akceptuje więcej niż jednej zmiennej o tej samej nazwie, więc istnieje potrzeba niestandardowej przestrzeni nazw.

Niestandardowa przestrzeń nazw

Przestrzeń nazw nie ma tylko jednej nazwy. Zamiast tego przestrzeń nazw ma zestaw nazw, aby uniknąć konfliktu z innymi zestawami nazw. Aby uniknąć konfliktu niżej w kodzie, poprzedź każdą nazwę nazwą przestrzeni nazw i :: . Poniższy program ilustruje to za pomocą dwóch niestandardowych przestrzeni nazw:

#włączać
przy użyciu standardowej przestrzeni nazw;

przestrzeń nazw NA
{
intvarInt= 6;
pływakflt;
}

przestrzeń nazw NB
{
intvarInt= 7;
pływakflt;
}

intGłówny()
{
koszt<<Nie dotyczy::varInt << ' ';
koszt<<NB::varInt << ' ';
Nie dotyczy::flt = 2,5;
NB::flt = 4,8;
koszt<<Nie dotyczy::flt << ' ';
koszt<<NB::flt << ' ';

powrót 0;
}

Dane wyjściowe to:

6
7
2,5
4,8

Zwróć uwagę, że nazwy NA::flt oraz NB::flt zostały ostatecznie zdefiniowane w Główny() funkcjonować. C++ nie pozwala na taką definicję w zakresie globalnym.

Należy zauważyć, że niestandardowa przestrzeń nazw jest zagnieżdżoną przestrzenią nazw dla globalnej przestrzeni nazw.

Dyrektywa dotycząca użytkowania

Aby uniknąć ciągłego wpisywania namepace::name zamiast samego name po zadeklarowaniu przestrzeni nazw, możesz użyć za pomocą dyrektywa. Składnia do użycia za pomocą dyrektywa jest następująca:

używanie przestrzeni nazw Namespace_name;

ten za pomocą dyrektywa nie jest dyrektywą preprocesora, więc kończy się średnikiem (;).

Poniższy program ilustruje użycie za pomocą dyrektywa i nie tylko:

#włączać
przy użyciu standardowej przestrzeni nazw;

przestrzeń nazw NB
{
intvarInt= 7;
intfunkcjonować()
{
powrótvarInt;
}
}

intfn()
{
używając przestrzeni nazw NB;
intmyVar2=funkcjonować();
//inne obiekty i funkcje z NB następują.
powrótmyVar2;
}

intmyVar3=NB::funkcjonować();

intGłówny()
{
koszt<<fn() << '' <<myVar3<< ' ';

powrót 0;
}

Wyjście tego programu to 7 7 . Termin za pomocą przestrzeni nazw NB; został umieszczony na początku fn() definicja. ten funkcja () z przestrzeni nazw NB jest wywoływana tuż poniżej, bez poprzedzania z Uwaga:: .

Zmienna zadeklarowana w zasięgu globalnym (globalna przestrzeń nazw) jest widoczna od momentu deklaracji do końca pliku. Jest to również widoczne w zagnieżdżonych przestrzeniach nazw (zakresach zagnieżdżonych), takich jak nested fn() zakres funkcji powyżej. ten za pomocą dyrektywa dołącza swoją przestrzeń nazw od pozycji, w której jest umieszczona, do końca zakresu, w którym jest umieszczona.

Imię funkcja () z przestrzeni nazw NB nie widać poniżej fn() definicja, ponieważ za pomocą przestrzeni nazw NB; został umieszczony w zakresie funkcji (blok). Pod tym warunkiem, aby użyć funkcja () poza blokiem przestrzeni nazw NB (zakres), musi być poprzedzony znakiem Uwaga:: , jak w poniższym oświadczeniu:

intmyVar3=NB::funkcjonować();

ten za pomocą dyrektywa łączy swoją przestrzeń nazw z zewnętrzną zagnieżdżoną przestrzenią nazw od pozycji, w której jest umieszczona, do końca zewnętrznej zagnieżdżonej przestrzeni nazw. W poniższym programie przestrzeń nazw NA jest połączona z globalną przestrzenią nazw. Obie przestrzenie nazw rozszerzają się następnie na fn() przestrzeń nazw definicji funkcji, w której są one połączone z przestrzenią nazw NB. Przestrzeń nazw NB kończy się na końcu fn() definicja funkcji, a dwie poprzednie przestrzenie nazw są kontynuowane do końca pliku (przeczytaj kod).

#włączać
przy użyciu standardowej przestrzeni nazw;

przestrzeń nazw NA
{
intvarInt= 6;
intfunkcjonować()
{
powrótvarInt;
}

}

przestrzeń nazw NB
{
intvarInt= 7;
intfunkcjonować()
{
powrótvarInt;
}
}

przy użyciu przestrzeni nazw NA;
intmyVar0=varInt;
//następują inne obiekty i funkcje z :: i NB.

intfn()
{
intmyVar1=varInt;
używając przestrzeni nazw NB;
intmyVar2=NB::funkcjonować();
//pozostałe obiekty i funkcje z NB podążają, aż do końca tego zakresu.
powrótmyVar1+myVar2;
}

//Następują tylko obiekty i funkcje z :: i NB.

intmyVar3=NB::funkcjonować();

intGłówny()
{
koszt<<myVar0<< '' <<fn() << '' <<myVar3<< ' ';

powrót 0;
}

Wyjście to 6, 13, 7 .

Notatka: Globalna przestrzeń nazw jest oznaczona :: , co oznacza, że ​​nie ma nic przed operatorem rozpoznawania zakresu, który następuje.

Pod oświadczeniem za pomocą przestrzeni nazw NA; zmienne z przestrzeni nazw global i NA mogą być używane bez wskazania ich źródłowej przestrzeni nazw. Następne zdanie używa varInt przestrzeni nazw NA. Połączony region przestrzeni nazw globalny i NA rozciąga się na fn() przestrzeń nazw funkcji. Więc varInt pierwszego stwierdzenia w fn() zakres funkcji należy do przestrzeni nazw NA.

Ponieważ region dla przestrzeni nazw global i NA rozciąga się na fn() zakres, po int mojaZm2 = NB::func(); , dowolna nazwa z przestrzeni nazw NB może być używana tylko w fn() zakres bez poprzedzania go Uwaga:: , tylko jeśli nie wystąpiło w NA i globalnych przestrzeniach nazw (blokach). W przeciwnym razie należy go poprzedzić Uwaga:: . Region połączonych przestrzeni nazw dla NA i global jest kontynuowany poniżej fn() definicji i do Główny() funkcja do końca pliku.

Rozszerzenie przestrzeni nazw NB zaczyna się od int mojaZm2 = NB::func(); w fn() blok i kończy się na końcu fn() blok definicji.

Notatka: Przestrzenie nazw, których regiony są połączone, nie powinny mieć tej samej nazwy zmiennej w swoich różnych blokach przestrzeni nazw, ponieważ nadal powodowałoby to konflikt.

Regiony przestrzeni nazw

Przestrzeń nazw to zakres. Poza globalną przestrzenią nazw (zakres globalny) dowolna przestrzeń nazw powinna być zadeklarowana w bloku. Ten blok jest pierwszą częścią potencjalnie rozproszonych regionów przestrzeni nazw. Dzięki dyrektywie using przestrzeń nazw można rozszerzyć jako regiony w innych zakresach.

Jednostki zadeklarowane w treści przestrzeni nazw są uważane za członków przestrzeni nazw, a nazwy wprowadzone przez te deklaracje do regionu deklaratywnego przestrzeni nazw są nazwami członkowskimi przestrzeni nazw.

Zagnieżdżone przestrzenie nazw

Poniższy program pokazuje zagnieżdżone przestrzenie nazw:

#włączać
przy użyciu standardowej przestrzeni nazw;

przestrzeń nazw A
{
inti= 1;
przestrzeń nazw B
{
inti= 2;
przestrzeń nazw C
{
inti= 3;
}
}
}

intGłówny()
{
koszt<<DO::i << '' <<DO::b::i << '' <<DO::b::C::i << ' ';

powrót 0;
}

Dane wyjściowe to:

1 2 3

Zwróć uwagę, że dostęp do trzech wartości uzyskano przy użyciu operatora rozpoznawania zakresu.

Standardowa przestrzeń nazw

C++ posiada bibliotekę zwaną biblioteką standardową. Nazwy obiektów, funkcji i innych jednostek w tej bibliotece pochodzą z przestrzeni nazw zwanej standardową przestrzenią nazw, zapisanej jako godziny . Biblioteka standardowa zawiera biblioteki podrzędne, a jedną z tych bibliotek podrzędnych jest jostream . ten jostream biblioteka zawiera obiekt koszt , który służy do wysyłania wyników do konsoli (terminala).

Imię koszt musi być w godziny przestrzeń nazw. Używać jostream z jego godziny przestrzeń nazw, program powinien wyglądać następująco:

#włączać
przy użyciu standardowej przestrzeni nazw;

Zwróć uwagę na użycie za pomocą dyrektywa i godziny . Termin #włączać jest dyrektywą preprocesora i nie kończy się średnikiem. Zawiera plik iostream w miejscu swojej dyrektywy.

Wniosek

Przestrzeń nazw to zakres. Opis przestrzeni nazw (definicja) zawiera podstawowe deklaracje i/lub definicje obiektów, funkcji i innych encji C++. Poza definicją przestrzeni nazw dostęp do nazwy można uzyskać za pomocą składni, Przestrzeń nazwNazwa::Nazwa . Poza globalną przestrzenią nazw (zakres globalny) dowolna przestrzeń nazw powinna być zadeklarowana w bloku. Ten blok jest pierwszą częścią potencjalnie rozproszonych regionów przestrzeni nazw. Z za pomocą dyrektywy, przestrzeń nazw można rozszerzyć jako regiony w innych zakresach. Przestrzenie nazw, których regiony są połączone, nie powinny mieć tej samej nazwy zmiennej w swoich różnych blokach przestrzeni nazw, ponieważ nadal powodowałoby to konflikt nazw.

Chrys