C++ Cosa sono gli spazi dei nomi?


Esempio

Uno spazio dei nomi C ++ è una raccolta di entità C ++ (funzioni, classi, variabili), i cui nomi sono preceduti dal nome del namespace. Quando si scrive codice all'interno di uno spazio dei nomi, le entità denominate appartenenti a tale spazio dei nomi non devono essere precedute dal nome del namespace, ma le entità esterne devono utilizzare il nome completo. Il nome completo ha il formato <namespace>::<entity> . Esempio:

namespace Example
{
  const int test = 5;

  const int test2 = test + 12; //Works within `Example` namespace
}

const int test3 = test + 3; //Fails; `test` not found outside of namespace.

const int test3 = Example::test + 3; //Works; fully qualified name used.

I namespace sono utili per raggruppare insieme le definizioni correlate. Prendi l'analogia di un centro commerciale. Generalmente un centro commerciale è suddiviso in diversi negozi, ogni negozio vende articoli da una specifica categoria. Un negozio potrebbe vendere prodotti elettronici, mentre un altro negozio potrebbe vendere scarpe. Queste separazioni logiche nei tipi di negozi aiutano gli acquirenti a trovare gli articoli che stanno cercando. I namespace aiutano i programmatori c ++, come gli acquirenti, a trovare le funzioni, le classi e le variabili che stanno cercando organizzandole in modo logico. Esempio:

namespace Electronics
{
    int TotalStock;
    class Headphones
    {
        // Description of a Headphone (color, brand, model number, etc.)
    };
    class Television
    {
        // Description of a Television (color, brand, model number, etc.)
    };
}

namespace Shoes
{
    int TotalStock;
    class Sandal
    {
        // Description of a Sandal (color, brand, model number, etc.)
    };
    class Slipper
    {
        // Description of a Slipper (color, brand, model number, etc.)
    };
}

C'è un singolo spazio dei nomi predefinito, che è lo spazio dei nomi globale che non ha nome, ma può essere indicato da :: . Esempio:

void bar() {
    // defined in global namespace
}
namespace foo {
    void bar() {
        // defined in namespace foo
    }
    void barbar() {
        bar();   // calls foo::bar()
        ::bar(); // calls bar() defined in global namespace
    }
}