C++ ¿Qué son los espacios de nombres?


Ejemplo

Un espacio de nombres de C ++ es una colección de entidades de C ++ (funciones, clases, variables), cuyos nombres tienen el prefijo del nombre del espacio de nombres. Al escribir código dentro de un espacio de nombres, las entidades con nombre que pertenecen a ese espacio de nombres no tienen que tener un prefijo con el nombre del espacio de nombres, pero las entidades externas deben usar el nombre completo. El nombre completo tiene el formato <namespace>::<entity> . Ejemplo:

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.

Los espacios de nombres son útiles para agrupar definiciones relacionadas. Tomemos la analogía de un centro comercial. En general, un centro comercial se divide en varias tiendas, cada una de las cuales vende artículos de una categoría específica. Una tienda podría vender productos electrónicos, mientras que otra tienda podría vender zapatos. Estas separaciones lógicas en los tipos de tiendas ayudan a los compradores a encontrar los artículos que están buscando. Los espacios de nombres ayudan a los programadores de c ++, como los compradores, a encontrar las funciones, clases y variables que buscan mediante su organización de una manera lógica. Ejemplo:

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.)
    };
}

Hay un espacio de nombres único predefinido, que es el espacio de nombres global que no tiene nombre, pero puede ser denotado por :: . Ejemplo:

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
    }
}