4.9.19 Operador de acceso a ámbito
§1 Sinopsis
Además de los que pueden declararse explícitamente con la palabra clave namespace
(
4.1.11), en C++ existen múltiples
espacios de nombres. El operador que aquí nos ocupa, debe debe su nombre precisamente a que sirve como puente o camino para
acceder a objetos que momentáneamente están fuera de ámbito.
El operador :: de acceso a ámbito o resolución de ámbito,
permite referenciar (acceder) a un tipo, objeto, función o enumerador incluso si su identificador está oculto. Por ejemplo,
anteponiéndolo a un identificador global, permite acceder al mismo incluso cuando es ocultado por una redeclaración homónima
(
4.1.11c).
Ejemplo:
int x = 2; // Variable global
...
void main() {
int x = 3; // Variable local
std::cout << "X = " << x <<
std::endl; // L.5: x local
std::cout << "X = " << ::x <<
std::endl; // L.6: x global
}
En el ejemplo anterior, la variable local x oculta momentáneamente a la global del mismo nombre. Sin embargo, como puede verse en L.6, el operador :: antepuesto a la variable señala que no se trata de la versión local, sino la perteneciente al ámbito global.
Al mismo tiempo, los especificadores std:: antepuestos a los objetos cout y endl especifican que tales objetos se encuentran en dicho espacio de nombres std, que pertenece a la Librería Estándar C++.
§2 Sintaxis
Como se deduce del propio ejemplo, desde un punto de vista formal existen dos tipos de operador de acceso a ámbito: unario y binario, que adoptan respectivamente las siguientes sintaxis:
:: <objeto> // Op. unario
<subespacio> :: <objeto> // Op. binario
En ambos casos, <objeto> es cualquier objeto, función o enumerador y se refiere a la versión del espacio global. Es el caso del término ::x en L.6 del ejemplo anterior.
Cuando se utiliza como operador binario, <subespacio> es el
nombre de un subespacio de nombres diferente del actual; el nombre de una
clase; estructura o unión (recuerde que estas entidades constituyen un tipo
especial de espacio de nombres). En estos casos el operador sirve para especificar objetos de espacios de nombres diferentes del actual (
4.1.11c).
Ejemplo:
namespace ALPHA {
...
long double LD;
class C {
public: int x;
};
}
ALPHA::LD = 1.0; // Acceso a variable LD
Para acceder a un miembro de clase debe especificarse el nombre de la clase seguido del operador y del miembro
[1]. Por ejemplo:
ALPHA::C::x = 1 // Acceso a miembro de C en ALPHA
Los identificadores precedidos por el operador de
resolución de ámbito se denominan identificadores cualificados.
[1] Cuando el miembro es el constructor o destructor de la clase, el acceso es ligeramente diferente
(
4.11.2d). Ver también
4.11.2e
para una discusión más detallada sobre el acceso a miembros de objetos y de clases.