Bereichsauflösungsoperator: ::

Der Bereichsauflösungsoperator :: wird verwendet, um bezeichner zu identifizieren und zu unterscheiden, die in verschiedenen Bereichen verwendet werden. Weitere Informationen zum Bereich finden Sie unter "Bereich".

Syntax

qualified-id:
nested-name-specifiertemplateoptunqualified-id

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

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

Hinweise

identifier kann eine Variable, eine Funktion oder ein Enumerationswert sein.

Wird für Klassen und Namespaces verwendet ::

Das folgende Beispiel zeigt die Verwendung des Bereichsauflösungsoperators mit Namespaces und Klassen:

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

Ein Bereichsauflösungsoperator ohne Bereichsqualifizierer verweist auf den globalen Namespace.

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

Sie können den Bereichsauflösungsoperator verwenden, um ein Element eines Elements namespacezu identifizieren oder einen Namespace zu identifizieren, der den Namespace des Elements in einer using Direktive angibt. Im folgenden Beispiel können Sie verwendenNamespaceC, um sich zu qualifizierenClassB, obwohl ClassB sie im Namespace NamespaceBdeklariert wurde, da NamespaceB sie von einer using Direktive nominiert NamespaceC wurde.

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

Bereichsauflösungsoperatoren können verkettet werden. Im folgenden Beispiel identifiziert NamespaceD::NamespaceD1 den geschachtelten Namespace NamespaceD1, und NamespaceE::ClassE::ClassE1 identifiziert die geschachtelte Klasse 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  ;
}

Verwendung :: für statische Member

Sie müssen den Bereichsauflösungsoperator verwenden, um statische Member von Klassen aufzurufen.

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

Wird für bereichsbezogene Enumerationen verwendet ::

Der Operator für die bereichsbezogene Auflösung wird auch mit den Werten einer enumerationsbezogenen Enumerationsdeklaration verwendet, wie im folgenden Beispiel gezeigt:

enum class EnumA{
    First,
    Second,
    Third
};

int main() {
    EnumA enum_value = EnumA::First;
}

Siehe auch

Integrierte C++-Operatoren, Rangfolge und Zuordnung
Namespaces