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
template
optunqualified-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 o namespace
para identificar un espacio de nombres que designe el espacio de nombres del miembro en una using
directiva. 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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: a lo largo de 2024, eliminaremos gradualmente los problemas de GitHub como mecanismo de comentarios para el contenido y lo reemplazaremos por un nuevo sistema de comentarios. Para obtener más información, consulte:Enviar y ver comentarios de