Compartir a través de


Operador de resolución de ámbito: ::

El operador :: de resolución de ámbito se usa para identificar y desambiguar identificadores usados en distintos ámbitos. Para obtener más información sobre el ámbito, vea Ámbito.

Sintaxis

qualified-id:
nested-name-specifier template optarunqualified-id

nested-name-specifier:
::
type-name ::
namespace-name ::
decltype-specifier ::
nested-name-specifier identifier ::
nested-name-specifier template optarsimple-template-id::

unqualified-id:
identifier
operator-function-id
conversion-function-id
literal-operator-id
~ type-name
~ decltype-specifier
template-id

Observaciones

identifier puede ser una variable, una función o un valor de enumeración.

Uso :: para clases y espacios de nombres

En el ejemplo siguiente se muestra cómo se usa el operador de resolución de ámbito con espacios de nombres y clases:

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 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 namespacepara identificar un espacio de nombres que designe el espacio de nombres del miembro en una using directiva. En el ejemplo siguiente, puede usar NamespaceC para calificar ClassB, aunque ClassB se declaró en el espacio de nombres NamespaceB, porque NamespaceB se ha designado en NamespaceC mediante una using directiva .

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;
}

Puede usar cadenas de operadores de resolución de ámbito. En el ejemplo siguiente, NamespaceD::NamespaceD1 identifica el espacio de nombres NamespaceD1anidado e NamespaceE::ClassE::ClassE1 identifica la clase ClassE1anidada .

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 :: 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 :: para enumeraciones con ámbito

El operador de resolución con ámbito también se usa con los valores de una declaración enumeración con ámbito, 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