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.