Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Operador de resolución de ámbito
El operador de resolución de ámbito ::
se usa para identificar los identificadores usados en distintos ámbitos y eliminar la ambigüedad entre ellos. Para obtener más información sobre el ámbito, consulte Ámbito.
Sintaxis
qualified-id
:
nested-name-specifier
opttemplate
unqualified-id
nested-name-specifier
:
::
type-name
::
namespace-name
::
decltype-specifier
::
nested-name-specifier
identifier
::
nested-name-specifier
template
optsimple-template-id
::
unqualified-id
:
identifier
operator-function-id
conversion-function-id
literal-operator-id
~
type-name
~
decltype-specifier
template-id
Comentarios
El identifier
puede ser una variable, una función o un valor de enumeración.
Uso de ::
para clases y espacios de nombres
En el ejemplo siguiente se muestra cómo se usa el operador de resolución con clases y espacios de nombres:
namespace NamespaceA{
int x;
class ClassA {
public:
int x;
};
}
int main() {
// A namespace name used to disambiguate
NamespaceA::x = 1;
// A class name used to disambiguate
NamespaceA::ClassA a1;
a1.x = 2;
}
Un operador de resolución de ámbito sin un calificador de ámbito hace referencia al espacio de nombres global.
namespace NamespaceA{
int x;
}
int x;
int main() {
int x;
// the x in main()
x = 0;
// The x in the global namespace
::x = 1;
// The x in the A namespace
NamespaceA::x = 2;
}
Puede usar el operador de resolución de ámbito para identificar un miembro de un namespace
,o para identificar un espacio de nombres que designe el espacio de nombres del miembro en una directiva de using
. En el ejemplo siguiente, se puede usar NamespaceC
para calificar ClassB
a pesar de que ClassB
se declaró en el espacio de nombres NamespaceB
, ya que se mencionó NamespaceB
en NamespaceC
mediante una directiva using
.
namespace NamespaceB {
class ClassB {
public:
int x;
};
}
namespace NamespaceC{
using namespace NamespaceB;
}
int main() {
NamespaceB::ClassB b_b;
NamespaceC::ClassB c_b;
b_b.x = 3;
c_b.x = 4;
}
Se pueden usar cadenas de operadores de resolución de ámbito. En el ejemplo siguiente, NamespaceD::NamespaceD1
identifica el espacio de nombres anidado NamespaceD1
y NamespaceE::ClassE::ClassE1
identifica la clase anidada ClassE1
.
namespace NamespaceD{
namespace NamespaceD1{
int x;
}
}
namespace NamespaceE{
class ClassE{
public:
class ClassE1{
public:
int x;
};
};
}
int main() {
NamespaceD:: NamespaceD1::x = 6;
NamespaceE::ClassE::ClassE1 e1;
e1.x = 7 ;
}
Uso de ::
para miembros estáticos
Debe usar el operador de resolución de ámbito para llamar a miembros estáticos de clases.
class ClassG {
public:
static int get_x() { return x;}
static int x;
};
int ClassG::x = 6;
int main() {
int gx1 = ClassG::x;
int gx2 = ClassG::get_x();
}
Uso de ::
para enumeraciones de ámbito
El operador de resolución de ámbito se usa también con los valores de una enumeración de ámbito en declaraciones de enumeración, como en el ejemplo siguiente:
enum class EnumA{
First,
Second,
Third
};
int main() {
EnumA enum_value = EnumA::First;
}
Consulte también
Operadores integrados de C++, precedencia y asociatividad
Espacios de nombres