1. ¿Por qué usar espacios de nombres?
Considere una situación en la que tenemos dos personas con el mismo nombre, Zara, en la misma clase. Cuando necesitamos distinguirlos, debemos usar información adicional y sus nombres, como esta área, si viven en diferentes áreas o el nombre de su madre o padre, etc.
Lo mismo sucederá en su aplicación C ++. Por ejemplo, podría estar escribiendo algún código con una función llamada xyz (), y hay otra biblioteca disponible que también tiene la misma función xyz (). Ahora el compilador no puede saber a qué versión de la función xyz () se refiere en el código.
El espacio de nombres está diseñado para superar esta dificultad y se utiliza como información adicional para distinguir funciones, clases, variables, etc. similares, que tienen el mismo nombre en diferentes bibliotecas. Usando el espacio de nombres, puede definir el contexto en el que se define el nombre. Esencialmente, el espacio de nombres define un alcance.
Segundo, la definición del espacio de nombres
Solo hay un alcance global en lenguaje C:
1. Todos los identificadores globales en el lenguaje C comparten un alcance
2. Posibles conflictos entre los identificadores
C ++ propuso el concepto de espacios de nombres:
1. El espacio de nombres divide el alcance global en diferentes partes,
2. Los identificadores en diferentes espacios de nombres pueden tener el mismo nombre sin conflicto
3. Los espacios de nombres pueden anidarse
4. El alcance global también se denomina espacio de nombres predeterminado
Definiendo un espacio de nombres
Una definición de espacio de nombres comienza con el espacio de nombres de palabras clave seguido del nombre del espacio de nombres de la siguiente manera:
namespace namespace_name { // declaraciones de código }
Para llamar a la versión habilitada para el espacio de nombres, ya sea de función o variable, anteponga (: :) el nombre del espacio de nombres de la siguiente manera:
Para llamar a la versión habilitada para el espacio de nombres de una función o variable, agregue (: :) antes del nombre del espacio de nombres, de la siguiente manera:
nombre :: código; // el código puede ser variable o funcional.
Veamos cómo el espacio de nombres abarca las entidades, incluidas las variables y las funciones:
Veamos cómo el espacio de nombres restringe entidades que incluyen variables y funciones:
#include <iostream> usando el espacio de nombres estándar; // nombre espacio de nombres espacio de nombres first_space { void func () { cout << " Inside first_space " << endl; } } // segundo nombre espacio namespace second_space { void func () { cout << " Inside second_space " << endl; } } int main () { // Llama a la función desde el espacio de nombre. first_space :: func (); // Las llamadas funcionan desde el espacio del segundo nombre. second_space :: func (); devuelve 0 ; }
Si compilamos y ejecutamos el código anterior, esto produciría el siguiente resultado:
Inside first_space
Inside second_space
También puede evitar usar la directiva de espacio de nombres. Agregue un prefijo antes del espacio de nombres. Esta directiva le dice al compilador que el código posterior está usando el nombre en el espacio de nombres especificado. Por lo tanto, el siguiente código implica el espacio de nombres
#include <iostream> usando el espacio de nombres estándar; // nombre espacio de nombres espacio de nombres first_space { void func () { cout << " Inside first_space " << endl; } } // segundo nombre espacio namespace second_space { void func () { cout << " Inside second_space " << endl; } } usando el espacio de nombres first_space; int main () { //Esto llama a la función desde el espacio de nombre. func (); devuelve 0 ; }
Si compilamos y ejecutamos el código anterior, esto produciría el siguiente resultado:
Inside first_space
La directiva 'using' también se puede usar para referirse a un elemento en particular dentro de un espacio de nombres. Por ejemplo, si la única parte del espacio de nombres estándar que tiene la intención de usar es cout, puede consultarlo de la siguiente manera:
El código posterior puede referirse 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:
#include <iostream> usando std :: cout; int main () { cout << " std :: endl se usa con std! " << std :: endl; devuelve 0 ; }
Si compilamos y ejecutamos el código anterior, esto produciría el siguiente resultado:
std :: endl se usa con std!
Los nombres introducidos en la directiva using siguen las reglas de alcance normal. El nombre es visible desde el punto de uso de la directiva hasta el final del ámbito donde se encuentra la directiva. Las entidades con el mismo nombre en el ámbito externo están ocultas.
Resumen
Uso del espacio de nombres C ++:
Use todo el espacio de nombres: usando el nombre del espacio de nombres; |
Use variables en el espacio de nombres: usando name :: variable |
Utilice variables del espacio de nombres predeterminado: :: variable |
Espacio de nombres discontinuo
El espacio de nombres se puede dividir en varias partes para definir, por lo que el espacio de nombres consiste en la suma de sus partes definidas por separado. Las diversas partes del espacio de nombres se pueden distribuir en múltiples archivos. Por lo tanto, si una parte del espacio de nombres requiere un nombre definido en otro archivo, el nombre aún debe declararse. Escriba la siguiente definición de espacio de nombres, o defina un nuevo espacio de nombres, o agregue nuevos elementos a un espacio de nombres existente.
namespace namespace_name { // declaraciones de código }
El espacio de nombres anidado puede anidar el espacio de nombres
Puede definir un espacio de nombres en otro espacio de nombres de la siguiente manera:
namespace namespace_name1 { // declaraciones de código namespace namespace_name2 { // declaraciones de código } }
Puede acceder a los miembros del espacio de nombres anidado utilizando el operador de resolución, de la siguiente manera:
// para acceder a los miembros de namespace_name2 usando namespace namespace_name1 :: namespace_name2; // para acceder a los miembros del espacio de nombres: nombre1 usando el espacio de nombres namespace_name1;
En la declaración anterior, si se utiliza namespace_name1, hará que los elementos de scope_name2 estén disponibles en el ámbito, como se muestra a continuación:
#include <iostream> usando el espacio de nombres estándar; // nombre espacio de nombres espacio de nombres first_space { void func () { cout << " Inside first_space " << endl; } // segundo espacio de nombres espacio de nombres second_space { void func () { cout << " Inside second_space " << endl; } } } usando el espacio de nombres first_space :: second_space; int main () { //Esto llama a la función del espacio del segundo nombre. func (); devuelve 0 ; }
Si compilamos y ejecutamos el código anterior, esto produciría el siguiente resultado:
Inside second_space
Referencia de https://www.tutorialspoint.com/cplusplus/cpp_namespaces.htm