Condividi tramite


Operatore di risoluzione dell'ambito: ::

L'operatore di risoluzione dell'ambito :: viene usato per identificare e risolvere l'ambiguità degli identificatori usati in diversi ambiti. Per altre informazioni sull'ambito, vedere Ambito.

:: identifier class-name :: identifier namespace :: identifier enum class :: identifier enum struct :: identifier

Note

identifier può essere una variabile una funzione oppure un valore di enumerazione.

Con classi e spazi dei nomi

L'esempio seguente mostra in che modo l'operatore di risoluzione dell'ambito viene usato con gli spazi dei nomi e le classi:

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 operatore di risoluzione dell'ambito senza un qualificatore dell'ambito fa riferimento allo spazio dei nomi globale.

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

È possibile usare l'operatore di risoluzione dell'ambito per identificare un membro di uno spazio dei nomi oppure per identificare uno spazio dei nomi che nomina lo spazio dei nomi del membro in una direttiva using. Nell'esempio seguente, è possibile usare NamespaceC per qualificare ClassB, anche se ClassB è stato dichiarato in uno spazio dei nomiNamespaceB, perché NamespaceB è stato nominato in NamespaceC da una direttiva using.

namespace NamespaceB {
    class ClassB {
    public:
        int x;
    };
}

namespace NamespaceC{
    using namespace B;

}
int main() {
    NamespaceB::ClassB c_b;
    NamespaceC::ClassB c_c;

    c_b.x = 3;
    c_c.x = 4;
}

È possibile usare catene di operatori di risoluzione dell'ambito. Nell'esempio seguente, NamespaceD::NamespaceD1 identifica lo spazio dei nomi annidato NamespaceD1 e NamespaceE::ClassE::ClassE1 identifica la classe annidata 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  ;
}

Con membri statici

Per chiamare i membri statici delle classi è necessario usare l'operatore di risoluzione dell'ambito.

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

Con enumerazioni con ambito

L'operatore di risoluzione dell'ambito è anche usato con i valori di un'enumerazione con ambito (Dichiarazioni di enumerazioni), come nell'esempio seguente:

enum class EnumA{
    First,
    Second,
    Third
};

int main() {

    EnumA enum_value = EnumA::First;
}

Vedere anche

Riferimenti

Operatori C++, precedenza e associazione

Spazi dei nomi (C++)

Nomi e nomi completi