- El espacio de nombres proporciona el espacio donde podemos definir o declarar un identificador, es decir, variable, método o clases.
- Usando el espacio de nombres, puede definir el espacio o contexto en el que se definen los identificadores, es decir, variable, método, clases. En esencia, un espacio de nombres define un ámbito.
Ventaja del espacio de nombres para evitar la colisión de nombres.
- Por ejemplo, es posible que esté escribiendo algún código que tenga una función llamada xyz() y haya otra biblioteca disponible que también tenga la misma función xyz(). Ahora el compilador no tiene forma de saber a qué versión de la función xyz() se refiere dentro de su código.
- Un espacio de nombres está diseñado para superar esta dificultad y se utiliza como información adicional para diferenciar funciones, clases, variables, etc. similares con el mismo nombre disponibles en diferentes bibliotecas.
- El mejor ejemplo de alcance de espacio de nombres es la biblioteca estándar de C++ (std) donde se declaran todas las clases, métodos y plantillas. Por lo tanto, al escribir un programa en C++ normalmente incluimos la directiva usando namespace std;
Definiendo un espacio de nombres:
- Una definición de espacio de nombres comienza con la palabra clave espacio de nombres seguida del nombre del espacio de nombres de la siguiente manera:
namespace namespace_name { // code declarations i.e. variable (int a;) method (void add();) classes ( class student{};) }>
- Cabe señalar que no hay punto y coma (;) después de la llave de cierre.
- Para llamar a la versión habilitada para el espacio de nombres de una función o variable, anteponga el nombre del espacio de nombres de la siguiente manera:
- nombre_espacio_nombre: :código; // el código puede ser variable, función o clase.
La directiva de uso:
- También puede evitar anteponer espacios de nombres con la directiva de espacio de nombres. Esta directiva le dice al compilador que el código posterior utiliza nombres en el espacio de nombres especificado.
- Por tanto, el espacio de nombres está implícito en el siguiente código:
C++
#include> using> namespace> std;> // first name space> namespace> first_space> {> > void> func()> > {> > cout <<> 'Inside first_space'> << endl;> > }> }> // second name space> namespace> second_space> {> > void> func()> > {> > cout <<> 'Inside second_space'> << endl;> > }> }> using> namespace> first_space;> int> main ()> {> > // This calls function from first name space.> > func();> > return> 0;> }> |
>
>Producción
Inside first_space>
- Los nombres introducidos en una directiva de uso obedecen a reglas de alcance normales. El nombre es visible desde el punto de la directiva de uso hasta el final del alcance en el que se encuentra la directiva. Las entidades con el mismo nombre definidas en un ámbito externo están ocultas.
Espacios de nombres anidados:
- Los espacios de nombres se pueden anidar donde puede definir un espacio de nombres dentro de otro espacio de nombres de la siguiente manera:
SYNTAX: namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }>
Puede acceder a los miembros del espacio de nombres anidado utilizando operadores de resolución de la siguiente manera:
// para acceder a los miembros de namespace_name2
usando el espacio de nombres namespace_name1::namespace_name2;
// para acceder a los miembros de namespace_name1
usando el espacio de nombres namespace_name1;
En las declaraciones anteriores, si está utilizando namespace_name1, los elementos de namespace_name2 estarán disponibles en el alcance de la siguiente manera:
C++
#include> using> namespace> std;> // first name space> namespace> first_space> {> > void> func()> > {> > cout <<> 'Inside first_space'> << endl;> > }> > // second name space> > namespace> second_space> > {> > void> func()> > {> > cout <<> 'Inside second_space'> << endl;> > }> > }> }> using> namespace> first_space::second_space;> int> main ()> {> > // This calls function from second name space.> > func();> > > return> 0;> }> |
>
>Producción
Inside second_space>
Veamos cómo el espacio de nombres abarca las entidades, incluidas variables y funciones:
C++
#include> using> namespace> std;> // first name space> namespace> first_space> {> > void> func()> > {> > cout <<> 'Inside first_space'> << endl;> > }> }> // second name space> namespace> second_space> {> > void> func()> > {> > cout <<> 'Inside second_space'> << endl;> > }> }> int> main ()> {> > // Calls function from first name space.> > first_space :: func();> > // Calls function from second name space.> > second_space :: func();> > return> 0;> }> |
>
>Producción
Inside first_space Inside second_space>
Considere el siguiente programa en C++:
CPP
// A program to demonstrate need of namespace> int> main()> {> > int> value;> > value = 0;> > double> value;> // Error here> > value = 0.0;> }> |
>
>
Producción :
Compiler Error: 'value' has a previous declaration as 'int value'>
En cada ámbito, un nombre sólo puede representar una entidad. Por tanto, no puede haber dos variables con el mismo nombre en el mismo ámbito. Usando espacios de nombres, podemos crear dos variables o funciones miembro que tengan el mismo nombre.
CPP
// Here we can see that more than one variables> // are being used without reporting any error.> // That is because they are declared in the> // different namespaces and scopes.> #include> using> namespace> std;> // Variable created inside namespace> namespace> first {> int> val = 500;> }> // Global variable> int> val = 100;> int> main()> {> > // Local variable> > int> val = 200;> > // These variables can be accessed from> > // outside the namespace using the scope> > // operator ::> > cout << first::val <<> '
'> ;> > return> 0;> }> |
>
>Producción
500>
Definición y Creación: Los espacios de nombres nos permiten agrupar entidades con nombre que de otro modo tendrían alcance global en ámbitos más estrechos, dándoles alcance del espacio de nombres . Esto permite organizar los elementos de los programas en diferentes ámbitos lógicos referidos por nombres. Los espacios de nombres proporcionan el espacio donde podemos definir o declarar identificadores, es decir, nombres de variables, métodos, clases, etc.
- Un espacio de nombres es una característica agregada en C++ y no está presente en C.
- Un espacio de nombres es una región declarativa que proporciona un alcance a los identificadores (nombres de funciones, variables u otros tipos de datos definidos por el usuario) dentro de él.
- Se permiten varios bloques de espacios de nombres con el mismo nombre. Todas las declaraciones dentro de esos bloques se declaran en el ámbito nombrado.
Una definición de espacio de nombres comienza con la palabra clave espacio de nombres seguido del nombre del espacio de nombres de la siguiente manera:
namespace namespace_name { int x, y; // code declarations where // x and y are declared in // namespace_name's scope }>
- Las declaraciones de espacios de nombres aparecen sólo en el ámbito global.
- Las declaraciones de espacios de nombres se pueden anidar dentro de otro espacio de nombres.
- Las declaraciones de espacios de nombres no tienen especificadores de acceso (Público o Privado).
- No es necesario colocar un punto y coma después de la llave de cierre de la definición del espacio de nombres.
- Podemos dividir la definición de espacio de nombres en varias unidades.
Definiendo un espacio de nombres:
Una definición de espacio de nombres comienza con la palabra clave espacio de nombres seguida del nombre del espacio de nombres de la siguiente manera:
C++
namespace> namespace_name{> > // code declarations i.e. variable (int a;)> > method (> void> add();)> > classes (> class> student{};)> }> |
>
>
Cabe señalar que no hay punto y coma (;) después de la llave de cierre.
Para llamar a la versión habilitada para espacios de nombres de una función o variable, anteponga el nombre del espacio de nombres de la siguiente manera:
nombre_espacio_nombre: :código; // el código podría ser una variable, función o clase.
C++
// Let us see how namespace scope the entities including variable and functions:> #include> using> namespace> std;> // first name space> namespace> first_space> {> > void> func()> > {> > cout <<> 'Inside first_space'> << endl;> > }> }> // second name space> namespace> second_space> {> > void> func()> > {> > cout <<> 'Inside second_space'> << endl;> > }> }> int> main ()> {> > // Calls function from first name space.> > first_space::func();> > // Calls function from second name space.> > second_space::func();> > return> 0;> }> // If we compile and run above code, this would produce the following result:> // Inside first_space> // Inside second_space> |
>
>Producción
Inside first_space Inside second_space>
La directiva de uso:
Puede evitar anteponer espacios de nombres con la directiva de espacio de nombres. Esta directiva le dice al compilador que el código posterior utiliza nombres en el espacio de nombres especificado. Por tanto, el espacio de nombres está implícito en el siguiente código:
C++
#include> using> namespace> std;> // first name space> namespace> first_space> {> > void> func()> > {> > cout <<> 'Inside first_space'> << endl;> > }> }> // second name space> namespace> second_space> {> > void> func()> > {> > cout <<> 'Inside second_space'> << endl;> > }> }> using> namespace> first_space;> int> main ()> {> > // This calls function from first name space.> > func();> > return> 0;> }> // If we compile and run above code, this would produce the following result:> // Inside first_space> |
>
>Producción
Inside first_space>
En lugar de acceder a todo el espacio de nombres, otra opción (conocida como usando declaración) es acceder a un elemento particular dentro de un espacio de nombres. Por ejemplo, si la única parte del espacio de nombres estándar que desea utilizar es cout, puede consultarlo de la siguiente manera:
usando std::cout;
El código posterior puede hacer referencia a cout sin anteponer el espacio de nombres, pero otros elementos en el espacio de nombres estándar aún deberán ser explícitos de la siguiente manera:
C++
operador ternario java
#include> using> std::cout;> int> main ()> {> > cout <<> 'std::endl is used with std!'> << std::endl;> > return> 0;> }> |
>
>Producción
std::endl is used with std!>
Los nombres introducidos en una directiva de uso obedecen a las reglas de alcance normales, es decir, son visibles desde el punto en que ocurre la directiva de uso hasta el final del alcance en el que se encuentra la directiva. Las entidades con el mismo nombre definidas en un ámbito externo están ocultas.
C++
// Creating namespaces> #include> using> namespace> std;> namespace> ns1 {> int> value() {> return> 5; }> }> // namespace ns1> namespace> ns2 {> const> double> x = 100;> double> value() {> return> 2 * x; }> }> // namespace ns2> int> main()> {> > // Access value function within ns1> > cout << ns1::value() <<> '
'> ;> > // Access value function within ns2> > cout << ns2::value() <<> '
'> ;> > // Access variable x directly> > cout << ns2::x <<> '
'> ;> > return> 0;> }> |
>
>
Producción:
5 200 100>
Clases y espacio de nombres: La siguiente es una forma sencilla de crear clases en un espacio de nombres:
C++
// A C++ program to demonstrate use of class> // in a namespace> #include> using> namespace> std;> namespace> ns> {> > // A Class in a namespace> > class> geek> > {> > public> :> > void> display()> > {> > cout<<> 'ns::geek::display()'> < } }; } int main() { // Creating Object of geek Class ns::geek obj; obj.display(); return 0; }> |
>
>Producción
ns::geek::display()>
Una clase también se puede declarar dentro del espacio de nombres y definirse fuera del espacio de nombres. utilizando la siguiente sintaxis:
CPP
// A C++ program to demonstrate use of class> // in a namespace> #include> using> namespace> std;> namespace> ns {> // Only declaring class here> class> geek;> }> // namespace ns> // Defining class outside> class> ns::geek {> public> :> > void> display() { cout <<> 'ns::geek::display()
'> ; }> };> int> main()> {> > // Creating Object of geek Class> > ns::geek obj;> > obj.display();> > return> 0;> }> |
>
>Producción
ns::geek::display()>
También podemos definir métodos fuera del espacio de nombres. . El siguiente es un código de ejemplo:
C++
// A C++ code to demonstrate that we can define> // methods outside namespace.> #include> using> namespace> std;> // Creating a namespace> namespace> ns {> void> display();> class> geek {> public> :> > void> display();> };> }> // namespace ns> // Defining methods of namespace> void> ns::geek::display()> {> > cout <<> 'ns::geek::display()
'> ;> }> void> ns::display() { cout <<> 'ns::display()
'> ; }> // Driver code> int> main()> {> > ns::geek obj;> > ns::display();> > obj.display();> > return> 0;> }> |
>
>
Producción:
ns::display() ns::geek::display():>
Espacios de nombres anidados:
Los espacios de nombres se pueden anidar, es decir, puede definir un espacio de nombres dentro de otro espacio de nombres de la siguiente manera:
C++
namespace> namespace_name1 {> > // code declarations> > namespace> namespace_name2 {> > // code declarations> > }> }> |
>
>
Puede acceder a los miembros de un espacio de nombres anidado utilizando el operador de resolución (::) de la siguiente manera:
C++
// to access members of namespace_name2> using> namespace> namespace_name1::namespace_name2;> // to access members of namespace:name1> using> namespace> namespace_name1;> |
>
>
En las declaraciones anteriores, si está utilizando namespace_name1, los elementos de namespace_name2 estarán disponibles en el alcance de la siguiente manera:
C++
#include> using> namespace> std;> // first name space> namespace> first_space> {> > void> func()> > {> > cout <<> 'Inside first_space'> << endl;> > }> > // second name space> > namespace> second_space> > {> > void> func()> > {> > cout <<> 'Inside second_space'> << endl;> > }> > }> }> using> namespace> first_space::second_space;> int> main ()> {> > > // This calls function from second name space.> > func();> > > return> 0;> }> // If we compile and run above code, this would produce the following result:> // Inside second_space> |
>
>Producción
Inside second_space>
El espacio de nombres ofrece la ventaja de evitar la colisión de nombres: -
Por ejemplo, es posible que esté escribiendo un código que tenga una función llamada xyz() y haya otra biblioteca disponible en su código que también tenga la misma función xyz(). Ahora el compilador no tiene forma de saber a qué versión de la función xyz() se refiere dentro de su código.
Un espacio de nombres está diseñado para superar esta dificultad y se utiliza como información adicional para diferenciar funciones, clases, variables, etc. similares con el mismo nombre disponibles en diferentes bibliotecas.
El mejor ejemplo de alcance de espacio de nombres es la biblioteca estándar de C++ (std), donde se declaran todas las clases, métodos y plantillas. Por lo tanto, al escribir un programa en C++, normalmente incluimos la directiva
usando el espacio de nombres estándar;
espacio de nombres en C++ | Conjunto 2 (espacio de nombres extendido y espacio de nombres sin nombre) Espacio de nombres en C++ | Conjunto 3 (Acceso, creación de encabezado, anidamiento y alias) ¿Se pueden anidar espacios de nombres en C++? Referencia : http://www.cplusplus.com/doc/tutorial/namespaces/