namespaces c
Kompletny przegląd przestrzeni nazw w C ++ z prostymi przykładami.
Do tej pory w naszych poprzednich samouczkach widzieliśmy wszystko o zmiennych, deklaracjach, funkcjach i innych tego typu jednostkach używanych w C ++.
Podczas tworzenia aplikacji w C ++ mogą wystąpić szczególne sytuacje, takie jak dwukrotne użycie tych samych nazw zmiennych lub zdefiniowanie funkcji z tymi samymi prototypami itp. Kiedy pojawiają się takie scenariusze, kompilatorowi trudno jest wydedukować prawidłowe wywołanie zmiennej lub funkcji, które powoduje niejednoznaczność .
=> Sprawdź idealny przewodnik szkoleniowy C ++ tutaj.
Czego się nauczysz:
- Co to jest przestrzeń nazw?
- Definiowanie przestrzeni nazw
- Dostęp do członków przestrzeni nazw
- Dyrektywa Using
- Zagnieżdżone przestrzenie nazw
- Zewnętrzne przestrzenie nazw
- Ciągłe przestrzenie nazw
- Wniosek
- rekomendowane lektury
Co to jest przestrzeń nazw?
Zobaczmy poniższy przykład:
#include #include int main() { int var; double var; std::cin>>var; }
Wynik:
W funkcji „int main ()”:
8:10: błąd: sprzeczna deklaracja „podwójna zmienna”
7: 7: uwaga: poprzednia deklaracja jako „int var”
W powyższym przykładzie zdefiniowaliśmy dwie zmienne o różnych typach, ale tym samym identyfikatorze. Więc kiedy kompilujemy ten przykład, otrzymujemy błąd, jak pokazano w oknie Output. Te sprzeczne deklaracje powstają z powodu użycia tego samego identyfikatora do nazwania dwóch zmiennych.
Tego typu sytuacje powodują niejednoznaczność zastosowań.
C ++ wprowadza coś, co nazywa się „ przestrzenie nazw ”, Aby rozwiązać ten problem. Przestrzeń nazw w C ++ jest podobna do pakietu, regionu lub biblioteki, która jest używana do rozróżniania zmiennej lub funkcji o tych samych identyfikatorach.
Przestrzeń nazw może zawierać zmienne, funkcje, klasy lub inne obiekty, a nawet inną przestrzeń nazw. Do każdego członka przestrzeni nazw można odwoływać się przy użyciu przestrzeni nazw. Pomaga to kompilatorowi rozróżniać różne jednostki programistyczne, nawet jeśli mają te same nazwy.
Definiowanie przestrzeni nazw
W C ++ możemy zdefiniować przestrzeń nazw używając słowa kluczowego „ przestrzeń nazw ' jak pokazano niżej:
namespace namespace_name{ namespace_declarations; }
Jeśli więc potrzebujemy zdefiniować przestrzeń nazw o nazwie „test_space”, możemy to zrobić jak poniżej:
namespace test_space{ int var=10; }
Powyższa deklaracja definiuje przestrzeń nazw o nazwie „test_space”. Jak pokazano, jego składnikiem jest zmienna całkowita var.
Dostęp do członków przestrzeni nazw
Teraz zdefiniowaliśmy naszą własną przestrzeń nazw „test_space” i jak możemy uzyskać dostęp do zawartości tej przestrzeni nazw?
W programie C ++ możemy uzyskać dostęp do członków przestrzeni nazw za pomocą składni:
namespace_name::namespace_member;
Zatem do zmiennej całkowitej var zadeklarowanej w przestrzeni nazw „obszar_testowy” powyżej można uzyskać dostęp w następujący sposób:
test_space::var;
Zobacz pełny przykład poniżej, aby zademonstrować przestrzenie nazw i ich użycie.
#include #include namespace test_space{ int var = 10; } int main() { double var = 20.53; std::cout<<'local var = '< Wynik:
local var = 20,53
test_space :: var = 10
W powyższym przykładzie programowania zademonstrowaliśmy wszystko o tworzeniu i uzyskiwaniu dostępu do przestrzeni nazw. Jak widzimy, „przestrzeń_testowa” to przestrzeń nazw, którą zdefiniowaliśmy. Ma zdefiniowaną jedną zmienną całkowitą var. Następnie w funkcji głównej mamy kolejną zainicjowaną podwójną zmienną var.
Później wyświetlamy obie te zmienne. Zauważ, że chociaż lokalna zmienna podwójna wewnątrz main może być wydrukowana bezpośrednio, aby wydrukować zmienną przestrzeni nazw, musimy poprzedzić ją nazwą przestrzeni nazw.
To również rozwiązało problem kolizji między zmiennymi z powodu tych samych nazw, które omówiliśmy wcześniej.
Dyrektywa Using
W naszym poprzednim temacie widzieliśmy, że możemy uzyskać dostęp do członków przestrzeni nazw przy użyciu nazwy_nazwa_nazwa :: element_nazwy.
Jeśli nie chcemy określać nazwy przestrzeni nazw wszędzie w programie, możemy skorzystać z opcji „ za pomocą ”, Aby włączyć przestrzeń nazw do programu.
Odbywa się to w następujący sposób:
#include #include namespace test_space{ int var = 10; } using namespace std; using namespace test_space; int main() { double var = 20.53; cout<<'local var = '< Wynik:
local var = 20,53
test_space :: var = 10
W powyższym przykładzie użyliśmy dwóch instrukcji po zdefiniowaniu przestrzeni nazw „test_space”.
To są:
using namespace std; using namespace test_space;
Pierwsza instrukcja używa deklaracji, aby uzyskać dostęp do przestrzeni nazw „std”, która jest predefiniowaną standardową przestrzenią nazw w bibliotece C ++. Ta przestrzeń nazw jest używana do uzyskiwania dostępu do różnych funkcji, takich jak cin, cout itp.
Druga instrukcja służy do włączenia przestrzeni nazw „test_space” do programu.
W funkcji głównej widzimy, że funkcje takie jak cout i zmienna var nie muszą być poprzedzone nazwą przestrzeni nazw. Możemy się do nich bezpośrednio odwołać. Ale ponieważ nazwa zmiennej koliduje ze zmienną lokalną w funkcji main, odwołujemy się do niej za pomocą operatora rozpoznawania zasięgu (: :), ponieważ przestrzenie nazw również zawsze mają zasięg globalny.
Zagnieżdżone przestrzenie nazw
C ++ pozwala także na zagnieżdżone przestrzenie nazw, tj. Przestrzeń nazw zdefiniowaną wewnątrz innej przestrzeni nazw.
Ogólna składnia zagnieżdżonych przestrzeni nazw jest następująca:
namespace ns1{ ns1_code; namespace ns2{ ns2_code; } }
Jeśli potrzebujemy uzyskać dostęp do ns2_code, możemy uzyskać do niego dostęp w następujący sposób:
ns1::ns2::ns2_code;
Pokażmy zagnieżdżone przestrzenie nazw za pomocą następującego kodu Przykład.
#include #include namespace first{ int var = 10; namespace second{ int secVar = 20; } } using namespace std; using namespace first; using namespace first::second; int main() { double var = 20.53; cout<<'local var = '< Wynik:
local var = 20,53
pierwszy :: var = 10
sekunda :: var = 20
W powyższym programie wykorzystaliśmy zagnieżdżone przestrzenie nazw. Zwróć uwagę na sposób, w jaki dyrektywa using jest używana do uzyskiwania dostępu do przestrzeni nazw. Nie wystarczy raz odwołać się tylko do najbardziej wewnętrznej przestrzeni nazw. Jeśli potrzebujemy kodu z najbardziej zewnętrznej przestrzeni nazw, musimy odnieść się do niego osobno.
Możemy użyć innej nazwy dla przestrzeni nazw, zwanej „aliasem”. Jest to szczególnie przydatne w przypadku używania zagnieżdżonych przestrzeni nazw, a stopień zagnieżdżenia jest wysoki.
Możemy zademonstrować alias dla przestrzeni nazw, modyfikując powyższy przykład.
#include #include namespace first{ int var = 10; namespace second{ int secVar = 20; } } using namespace std; using namespace first; namespace nested = first::second; int main() { double var = 20.53; cout<<'local var = '< Wynik:
local var = 20,53
pierwszy :: var = 10
sekunda :: var = 20
Zwróć uwagę na zagnieżdżony alias zdefiniowany dla przestrzeni nazw first :: second. Po zdefiniowaniu aliasu możemy odwołać się do przestrzeni nazw, używając nazwy aliasu.
Zewnętrzne przestrzenie nazw
Czasami, gdy mamy zbyt wiele przestrzeni nazw do wykorzystania w naszej aplikacji, możemy chcieć umieścić wszystkie przestrzenie nazw w oddzielnym pliku. Można to łatwo zrobić. Kiedy przestrzenie nazw znajdują się w oddzielnym pliku, po prostu dołączamy ten plik do naszego programu, a następnie bezpośrednio używamy przestrzeni nazw i ich zawartości w naszym programie.
Na przykład, jeśli mamy plik o nazwie ns.h, który zawiera następującą przestrzeń nazw.
//ns.h namespace first{ int var = 25; }
Teraz w naszym programie możemy użyć przestrzeni nazw „first” w następujący sposób:
#include #include “ns.h” using namespace std; int main() { cout<Więc kiedy włączymy plik zawierający przestrzenie nazw do naszego programu, możemy używać przestrzeni nazw tak, jakby były zadeklarowane globalnie w tym samym programie.
Ciągłe przestrzenie nazw
C ++ pozwala nam także zdefiniować coś, co nazywa się ciągłymi przestrzeniami nazw. Ciągłe przestrzenie nazw to przestrzenie nazw, które są definiowane więcej niż jeden raz za pomocą tej samej nazwy. W rzeczywistości nie są to oddzielne przestrzenie nazw, ale rozszerzenia tej samej przestrzeni nazw.
Ciągłe przestrzenie nazw są widoczne w poniższym przykładzie.
#include #include . namespace first{ int var = 10; } namespace first{ namespace second{ int secVar = 20; } } using namespace std; using namespace first; namespace nested = first::second; int main() { double var = 20.53; cout<<'local var = '< Wynik:
local var = 20,53
pierwszy :: var = 10
sekunda :: var = 20
Zwróć uwagę, że w powyższym przykładzie dwukrotnie zdefiniowaliśmy tę samą przestrzeń nazw. W pierwszej definicji mamy zmienną o nazwie var. Podczas gdy w drugiej deklaracji mamy zdefiniowaną inną przestrzeń nazw.
W funkcji głównej uzyskaliśmy dostęp do elementów członkowskich zewnętrznej i wewnętrznej przestrzeni nazw i zauważmy, że dostęp do elementów członkowskich jest łatwy.
To jest przykład ciągłych przestrzeni nazw, nazywanych czasami „nieciągłymi przestrzeniami nazw”. Ich definicje wydają się oddzielne, ale w rzeczywistości są to ciągłe przestrzenie nazw.
Wniosek
W ten sposób dotarliśmy do końca tego samouczka dotyczącego przestrzeni nazw w C ++. Przestrzenie nazw w jeden sposób, który pozwala nam oddzielić nasz kod w różnych przestrzeniach lub regionach, abyśmy mieli jasność w czytaniu go, a także w używaniu jego członków.
czym jest testowanie regresji w testowaniu oprogramowania
W naszych kolejnych samouczkach dowiemy się więcej o różnych podstawowych tematach C ++, takich jak obsługa wyjątków, wejście / wyjście pliku itp.
=> Sprawdź tutaj, aby zobaczyć samouczki szkoleniowe od A do Z języka C ++ tutaj.
rekomendowane lektury
- Najlepsza DARMOWA seria samouczków języka C #: najlepszy przewodnik po języku C # dla początkujących
- Testowanie obciążenia za pomocą samouczków HP LoadRunner
- Funkcje biblioteczne w C ++
- 70+ NAJLEPSZYCH samouczków C ++ do nauki programowania w C ++ ZA DARMO
- Programowanie obiektowe w C ++
- Listy inicjalizacyjne w C ++
- Iteratory w STL
- Hermetyzacja w C ++