C ++ Succinct Namespaces

Namespace-ul global

Hai să ne aruncăm cu grijă să aruncăm o privire la un exemplu.

Mostră: GlobalNamespaceSample \ GlobalNamespaceSample.cpp

#include  #include  #include "... /pchar.h" int g_x = 10; int AddTwoNumbers (int a, int b) returnați 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; 

În proba anterioară, definim două funcții, AddTwoNumbers și wmain. Aceste două funcții se află atât în ​​spațiul de nume global. Spațiul de nume global este nivelul de bază în care există tot ceea ce există în cadrul programului. C ++, datorită patrimoniului său C, vă permite să definiți ceva în spațiul de nume global (astfel încât să puteți defini spații de nume, clase, structuri, variabile, funcții, enumuri și șabloane).

C # are, de asemenea, conceptul de spațiu de nume global, dar nu vă permite să definiți nimic altceva decât spații de nume și tipuri. În exemplul anterior, avem instrucțiunea int g_x = 10; care definește un întreg numit g_x în spațiul de nume global și îi atribuie o valoare de 10. Aceasta este ceea ce este denumit în mod obișnuit o variabilă globală. În variabilele globale C # sunt ilegale.

Pe scurt, fiecare limbă de programare cu care am lucrat vreodată a avut parte de caracteristici rele - lucruri pe care limba le permite, dar lucruri care de obicei duc la probleme. Aceste probleme includ probleme greu de depanat, erori subtile care nu se mai văd de mult timp, probleme de întreținere, probleme de citire și toate celelalte lucruri frustrante care adaugă multe ore la timpul de dezvoltare fără nici un beneficiu. C ++ nu este diferit. Când vom întâlni ceva care se potrivește cu această descriere, voi face tot posibilul să-l chem. Aceasta este una din acele vremuri.

Variabilele globale sunt rele. Evitați-le ori de câte ori este posibil. Există o convenție comună atunci când se utilizează în C ++, care este de a prefixa numele variabilei cu g_, ca în exemplul anterior. În timp ce acest lucru vă ajută să vă avertizați pe dvs. și pe alți programatori asupra faptului că aceasta este o variabilă globală, aceasta nu schimbă faptul că este o variabilă globală, având toate problemele pe care le-am descris. Aceasta nu este o carte despre practicile de programare proastă, așa că nu voi mai petrece timp pentru a explica de ce variabilele globale sunt rele. Tot ce trebuie să știți este că această caracteristică există în C ++, dar ar trebui să evitați să o utilizați ori de câte ori este posibil.


Operatorul de rezoluție de domeniu ::

În C++, :: este operatorul de rezoluție a domeniului. Se utilizează pentru separarea spațiilor de nume imbricate, pentru separarea tipurilor din spațiul lor de nume și pentru separarea funcțiilor și a variabilelor membrilor de tipul lor.

Rețineți că este utilizat numai în ultima situație atunci când efectuați următoarele:

  • Definirea funcției unui membru.
  • Accesarea unui membru dintr-o clasă de bază în cadrul unei definiții a funcției unui membru.
  • Accesarea unei funcții sau a unei variabile statice.
  • Atribuirea unei valori unei variabile statice a elementului.
  • Obținerea adresei unei funcții a unui membru.

În alte cazuri, utilizați fie. operatorul sau operatorul ->, în funcție de faptul dacă accesați membrul direct sau printr-un pointer.

Acest lucru poate părea complicat, deoarece C # utilizează doar. operator pentru toate scopurile pe care ::,., și -> sunt folosite în C++.

Notă: Vom discuta. și -> operatori mai târziu. Pentru moment, trebuie doar să știți că sunt utilizate pentru a accesa variabilele membrilor instanțelor și funcțiile membrilor non-statici (pe care le utilizați în funcție de faptul că lucrați sau nu cu un pointer).

În cea mai mare parte, veți fi bine. Singurul loc în care este probabil să vă opriți este dacă încercați să accesați un membru de clasă de bază utilizând funcția. operator, mai degrabă decât operator :: sau dacă încercați să specificați un membru enum folosind altceva decât ::. Dacă compilați programul dvs. și primiți o eroare de sintaxă care se plânge de "lipsă"; inainte de '.' ", este un pariu bun pe care l-ați folosit a. unde ar fi trebuit să folosiți un :: în schimb.


Definirea spațiilor de nume

Un spațiu de nume este definit în același mod ca în C #. Iată un exemplu:

Exemplu: NamespacesSample \ NamespacesSample.cpp

#include  #include  #include  #include "... /pchar.h" folosind namespace std; namespace Locații namespace Cities struct Oraș City (const wchar_t * name) Name = wstring (nume);  numele wstring; ;  int _pmain (int / * argc * /, _pchar * / * argv * / []) auto nyc = Locuri :: Orașe :: Orașul (L "New York City"); wcout << L"City name is " << nyc.Name.c_str() << L"." << endl; return 0; 

Notă: Nu includeți niciodată o directivă de utilizare într-un fișier antet. Dacă faceți acest lucru, nu doar importați tipurile și spațiile de nume din spațiul de nume în fișierul antet, le importați, de asemenea, în orice fișier sursă sau antet care include fișierul antet. Acest lucru provoacă probleme de poluare cu adevărat urât. Vom discuta mai departe fișierele antet, deci tot ce este neclar cu privire la acest lucru ar trebui să aibă sens atunci. Amintiți-vă că folosirea unei directive privind utilizarea unui nume de domeniu într-un fișier antet este o idee proastă; utilizați-le numai în fișierele cu cod sursă.

Concluzie

Ca în majoritatea limbilor, spațiile de nume sunt importante în C ++ pentru a păstra totul organizat și pentru a evita coliziuni de nume. În următoarea tranșă a acestei serii, ne vom concentra pe funcții și clase.

Această lecție reprezintă un capitol din C ++ Succinctly, o carte electronică gratuită de la echipa de la Syncfusion.
Cod