Considere las siguientes dos declaraciones escalares en un alcance global, en el siguiente programa:
#incluir
usando el espacio de nombres STD;
int varid = 5;
Varid flotante = 2.3;
int main ()
regresar 0;
Un intento de compilar este programa conduce a un error de compilación. Hay dos variables con el mismo nombre, varío. Aunque son dos variables diferentes de dos tipos diferentes, En t y flotar, El compilador rechaza las dos declaraciones porque son del mismo nombre. El siguiente programa resuelve este problema declarando las variables con el mismo nombre en dos ámbitos generalizados diferentes:
#incluir
usando el espacio de nombres STD;
espacio de nombres na
int varid = 5;
espacio de nombres nb
Varid flotante = 2.3;
int main ()
cout << NA::varId << '\n';
cout << NB::varId << '\n';
regresar 0;
La salida es la siguiente:
5Hay dos espacios de nombres en el programa anterior: N / A, que tiene la definición de un entero, y NÓTESE BIEN, que tiene la definición de un flotador pero con el mismo nombre que el entero para NA. Finalmente, cuando se ejecutó el programa, se usó el mismo nombre para dos variables diferentes. Tenga en cuenta que para acceder al mismo nombre de dos variables diferentes, se debe usar el nombre particular para el espacio de nombres, seguido del identificador común. El nombre del espacio de nombres y el identificador común están separados por el operador de resolución de alcance, ""::."El nombre de los espacios de nombres diferenciará los objetos.
Este artículo cubre el concepto básico de un espacio de nombres y su uso en el lenguaje de programación C ++. Para seguir este artículo, debe tener un conocimiento básico del lenguaje C ++. También debe tener conocimiento del alcance de C ++, aunque se explica brevemente en este artículo. Para obtener más información sobre el alcance de C ++, busque la frase, "Alcance en C ++" (sin citas) en el cuadro de búsqueda de cualquier Linuxhint.COM Página web y presione Entrar. Esto te llevará al artículo que escribió este autor.
Contenido del artículo
¿Qué es un espacio de nombres??
Una región declarativa es la parte más grande de un programa en el que el nombre de una entidad (variable) es válido. Esta región se llama alcance. Un espacio de nombres en C ++ es un alcance generalizado cuyo objetivo principal es resolver los conflictos de nombres. Un espacio de nombres tiene declaraciones básicas y/o definiciones de entidades.
Espacio de nombres global y su problema
El espacio de nombres global es el alcance global. Considere el siguiente programa corto:
#incluir
usando el espacio de nombres STD;
int ident = 55;
Float Ident = 12.17;
int main ()
regresar 0;
En el programa anterior, hay dos variables, ambas llamadas identificación. Estas variables están en el alcance global; es decir, están en el espacio de nombres global. Un intento de compilar este programa fallará con un mensaje de error. El alcance global no acepta más de una variable con el mismo nombre, por lo que es necesario un espacio de nombres personalizado.
Espacio de nombres personalizado
Un espacio de nombres no tiene un solo nombre. En cambio, un espacio de nombres tiene un conjunto de nombres para evitar conflictos con otros conjuntos de nombres. Para evitar conflictos más bajos en el código, precede a cada nombre con el nombre del espacio de nombres y :: . El siguiente programa ilustra esto utilizando dos espacios de nombres personalizados:
#incluir
usando el espacio de nombres STD;
espacio de nombres na
int varint = 6;
flotante flt;
espacio de nombres nb
int varint = 7;
flotante flt;
int main ()
cout << NA::varInt << '\n';
cout << NB::varInt << '\n';
Na :: flt = 2.5;
Nb :: flt = 4.8;
cout << NA::flt << '\n';
cout << NB::flt << '\n';
regresar 0;
La salida es:
6Tenga en cuenta que los nombres Na :: flt y Nb :: flt finalmente se han definido en el principal() función. C ++ no permite tal definición en el alcance global.
Tenga en cuenta que el espacio de nombres personalizado es un espacio de nombres anidado para el espacio de nombres global.
La directiva de uso
Para evitar escribir "namepace :: nombre" todo el tiempo en lugar de solo "nombre" después de declarar el espacio de nombres, puede usar el usando directiva. La sintaxis para usar el usando La directiva es la siguiente:
Usando Namespace Namespace_name;
El usando La directiva no es una directiva preprocesadora, por lo que termina con un punto y coma (;).
El siguiente programa ilustra el uso del usando Directiva y más:
#incluir
usando el espacio de nombres STD;
espacio de nombres nb
int varint = 7;
int func ()
return varint;
int fn ()
usando el espacio de nombres NB;
int myVar2 = func ();
// Otros objetos y funciones de NB siguen.
regresar myvar2;
int myVar3 = nb :: func ();
int main ()
cout << fn() << " << myVar3 << '\n';
regresar 0;
La salida de este programa es 7 7. El término "usando el espacio de nombres NB;"Ha sido colocado al comienzo del fn () definición. El func () Desde el espacio de nombres de NB se llama justo debajo de eso, sin precedir con "NÓTESE BIEN::."
Se observa una variable declarada en el alcance global (espacio de nombres global) desde el punto de declaración hasta el final del archivo. También se ve en los espacios de nombres anidados (ámbitos anidados), como los anidados fn () Al alcance de la función arriba. El usando La directiva une su espacio de nombres desde la posición en la que se coloca hasta el final del alcance en el que se coloca.
El nombre func () Desde el espacio de nombres de NB no se puede ver debajo del fn () Definición porque "usando el espacio de nombres nb; " se colocó dentro del alcance de la función (bloque). Bajo esta condición, para usar "func ()"Fuera del bloque de espacio de nombres de NB (alcance), debe ser precedido por"NÓTESE BIEN::,"Como en la siguiente declaración:
int myVar3 = nb :: func ();
El usando La directiva une su espacio de nombres con el espacio de nombres de anidación externa desde la posición en la que se coloca hasta el final del espacio de nombres de anidación externa. En el siguiente programa, el espacio de nombres de NA se une al espacio de nombres global. Ambos espacios de nombres se extienden a la fn () espacio de nombres de definición de función, en el que se unen con el espacio de nombres de NB. El espacio de nombres de NB termina al final del fn () Definición de la función, y los dos espacios de nombres anteriores continúan hasta el final del archivo (lea el código).
#incluir
usando el espacio de nombres STD;
espacio de nombres na
int varint = 6;
int func ()
return varint;
espacio de nombres nb
int varint = 7;
int func ()
return varint;
usando el espacio de nombres na;
int myVar0 = varInt;
// Otros objetos y funciones de :: y NB siguen.
int fn ()
int myVar1 = varInt;
usando el espacio de nombres NB;
int myVar2 = nb :: func ();
// Otros objetos y funciones de NB siguen, hasta el final de este alcance.
devolver myvar1 + myvar2;
// Solo los objetos y funciones de :: y NB siguen.
int myVar3 = nb :: func ();
int main ()
cout << myVar0 << " <<
fn () << " << myVar3 <<
'\norte';
regresar 0;
La salida es 6, 13, 7.
Nota: El espacio de nombres global se indica con :: , lo que significa que no hay nada antes del operador de resolución de alcance que sigue.
Debajo de la declaración, el "usando el espacio de nombres na;"Las variables de los espacios de nombres Global y NA se pueden usar sin una indicación de su espacio de nombres de origen. La siguiente declaración usa el varint del espacio de nombres de NA. La región de espacio de nombres global y combinada de NA se extiende a la fn () Espacio de nombres de funciones. Entonces el varint de la primera declaración en el fn () El alcance de la función es del espacio de nombres de NA.
Dado que la región para los espacios de nombres globales y de NA se extiende a lo largo del fn () alcance, después del "int myVar2 = nb :: func ();,"Cualquier nombre del espacio de nombres de NB solo se puede usar en el fn () alcance sin precedirlo con "NÓTESE BIEN::,"Solo si no ocurrió en los espacios de nombres de NA y globales (bloques). De lo contrario, debe ser precedido por "NÓTESE BIEN::."La región de los espacios de nombres combinados para NA y Global continúa debajo del fn () definición y en el principal() función hasta el final del archivo.
La extensión del espacio de nombres de NB comienza desde "int myVar2 = nb :: func ();" en el fn () bloquear y termina al final del fn () bloque de definición.
Nota: Los espacios de nombres cuyas regiones están unidas no deben tener el mismo nombre variable en sus diferentes bloques de espacio de nombres, ya que esto aún causaría conflicto.
Regiones del espacio de nombres
Un espacio de nombres es un alcance. Además del espacio de nombres global (alcance global), cualquier espacio de nombres debe declararse en un bloque. Ese bloque es la primera parte de las regiones posiblemente distribuidas del espacio de nombres. Con la directiva de uso, el espacio de nombres se puede extender como regiones en otros ámbitos.
Se dice que las entidades declaradas en un cuerpo de espacio de nombres son miembros del espacio de nombres, y se dice que los nombres introducidos por estas declaraciones en la región declarativa del espacio de nombres son nombres de miembros del espacio de nombres.
Espacios de nombres anidados
El siguiente programa muestra espacios de nombres anidados:
#incluir
usando el espacio de nombres STD;
espacio de nombres a
int i = 1;
espacio de nombres b
int i = 2;
espacio de nombres c
int i = 3;
int main ()
cout << A::i << " <<
A :: b :: yo << " <<
A :: b :: c :: i << '\n';
regresar 0;
La salida es:
1 2 3Observe que se ha accedido a los tres valores utilizando el operador de resolución de alcance.
Espacio de nombres
C ++ tiene una biblioteca llamada Biblioteca estándar. Los nombres de objetos, funciones y otras entidades en esta biblioteca son de un espacio de nombres llamado el espacio de nombres estándar, escrito como std. La biblioteca estándar contiene sub-bibliotecas, y una de estas sub-bibliotecas es iostream. El iostream La biblioteca contiene el objeto cout, que se usa para enviar resultados a la consola (terminal).
El nombre cout debe estar en el std espacio de nombres. Usar iostream con su std espacio de nombres, el programa debe ser el siguiente:
#incluirTenga en cuenta el uso del usando directiva y std. El término "#incluir "Es una directiva preprocesadora y no termina con un punto y coma. Incluye el "archivo" iOStream en la posición de su directiva.
Conclusión
Un espacio de nombres es un alcance. La descripción del espacio de nombres (definición) contiene declaraciones básicas y/o definiciones de objetos, funciones y otras entidades C ++. Fuera de la definición del espacio de nombres, se puede acceder al nombre con la sintaxis ","nombre de nombre de nombre :: nombre."Además del espacio de nombres global (alcance global), cualquier espacio de nombres debe declararse en un bloque. Ese bloque es la primera parte de las regiones posiblemente distribuidas del espacio de nombres. Con el usando Directiva, el espacio de nombres se puede extender como regiones en otros ámbitos. Los espacios de nombres cuyas regiones están unidas no deben tener el mismo nombre variable en sus diferentes bloques de espacio de nombres, ya que esto aún causaría conflicto de nombre.