La oss dykke rett inn ved å se på et eksempel.
Eksempel: GlobalNamespaceSample \ GlobalNamespaceSample.cpp
#inkludere#inkludere #include "... /pchar.h" int g_x = 10; int AddTwoNumbers (int a, int b) return a + b; int _pmain (int / * argc * /, _pchar * / * argv * / []) int y = 20; std :: wcout << L"The result of AddTwoNumbers(g_x, y) where g_x = " << g_x << L" and y = " << y << L" is " << AddTwoNumbers(g_x, y) << L"." << std::endl; if (true == 1) std::wcout << L"true == 1!" << std::endl; return 0;
I den forrige prøven definerer vi to funksjoner, AddTwoNumbers
og wmain
. Disse to funksjonene er begge i det globale navneområdet. Det globale navneområdet er basisnivået der alt annet i programmet eksisterer. C ++, på grunn av sin C-arv, lar deg definere noe i det globale navneområdet (slik at du kan definere navneområder, klasser, strukturer, variabler, funksjoner, enums og maler).
C # har også konseptet om et globalt navneområde, men det tillater deg ikke å definere noe i det annet enn navneområder og typer. I forrige eksempel har vi setningen int g_x = 10; som definerer et heltall navngitt g_x innenfor det globale navneområdet og tildeler det en verdi på 10. Dette er det som ofte kalles en global variabel. I C # er globale variabler ulovlige.
Kort sagt, hvert programmeringsspråk jeg noensinne har jobbet med har hatt sin del av dårlige funksjoner - ting språket tillater, men ting som vanligvis fører til problemer. Disse problemene inkluderer vanskelige å feilsøke problemer, subtile feil som ikke ser på merkevaren, vedlikeholdsproblemer, lesbarhetsproblemer og alle de andre frustrerende tingene som legger mange timer til utviklingstid uten noen fordel. C ++ er ikke annerledes. Når vi kommer over noe som passer til denne beskrivelsen, vil jeg gjøre mitt beste for å kalle det ut. Dette er en av disse tider.
Globale variabler er dårlige. Unngå dem når det er mulig. Det er en vanlig konvensjon når du bruker dem i C ++, som skal prefikse variabelenavnet med g_, som i forrige eksempel. Selv om dette bidrar til å varsle deg og andre programmerere på at dette er en global variabel, endrer det ikke det faktum at det er en global variabel som har alle de problemene jeg beskrev. Dette er ikke en bok om dårlig programmeringspraksis, så jeg skal ikke bruke tid på å forklare hvorfor globale variabler er dårlige. Alt du trenger å vite er denne funksjonen finnes i C ++, men du bør unngå å bruke den når det er mulig.
::
I C++, ::
er omfangsoppløsningsoperatøren. Den brukes til å skille inn nestede navneområder, for å skille typer fra deres navneområde, og for å skille mellom medlemsfunksjoner og variabler av deres type.
Legg merke til at den bare brukes i den siste situasjonen når du utfører følgende:
I andre tilfeller bruker du enten. operatør eller -> operatør, avhengig av om du har tilgang til medlemmet direkte eller via en peker.
Dette kan virke komplisert siden C # bruker bare. operatør for alle de formålene som ::,., og -> brukes til i C++.
Merk: Vi diskuterer. og -> operatører senere. For øyeblikket trenger du bare å vite at de brukes til å få tilgang til instanselementvariabler og ikke-statiske medlemsfunksjoner (som du bruker avhengig av om du arbeider med en peker).
For det meste blir det bra. Det eneste stedet du sannsynligvis vil reise opp er hvis du prøver å få tilgang til et grunnklassemedlem ved å bruke. operatør i stedet for :: -operatøren, eller hvis du prøver å spesifisere et enummedlem med noe annet enn ::. Hvis du noensinne kompilerer programmet og mottar en syntaksfeil som klager på "missing"; ' før '.' "Det er en god innsats at du brukte en. hvor du burde ha brukt en :: i stedet.
Et navneområde defineres på omtrent samme måte som det er i C #. Her er et eksempel:
Eksempel: NavnegrupperSample \ NavnegrupperSample.cpp
#inkludere#inkludere #inkludere #include "... /pchar.h" ved hjelp av navneområde std; namespace Steder namespace Cities struct City City (const wchar_t * navn) Name = wstring (navn); wstring navn; ; int _pmain (int / * argc * /, _pchar * / * argv * / []) auto nyc = Steder :: Byer :: By (L "New York City"); wcout << L"City name is " << nyc.Name.c_str() << L"." << endl; return 0;
Merk: Ikke ta med et brukerdirektiv i en headerfil. Hvis du gjør det, importerer du ikke bare typene og navneområdene i det navneområdet i headerfilen, du importerer dem også til en kilde eller headerfil som inneholder headerfilen. Dette forårsaker virkelig ekkel navneskapsforurensning. Vi diskuterer toppfiler neste, så noe som er uklart om dette, burde være fornuftig da. Bare husk at å ha et brukernavne-direktiv i en headerfil er en dårlig ide; bare bruk dem i kildekoden filer.
Som i de fleste språk er navneområder viktig i C ++ for å holde alt organisert og for å unngå navnekollisjoner. I neste avdeling av denne serien fokuserer vi på funksjoner og klasser.
Denne leksjonen representerer et kapittel fra C ++ Succinctly, en gratis eBok fra teamet på Syncfusion.