C++
Utilizzando la dichiarazione
Ricerca…
introduzione
Una dichiarazione using
introduce un singolo nome nello scope corrente precedentemente dichiarato altrove.
Sintassi
- usando typename ( opt ) nested-name-specifier unqualified-id ;
- usando :: id non qualificato ;
Osservazioni
Una dichiarazione d'uso è distinta da una direttiva using , che dice al compilatore di cercare in uno spazio dei nomi particolare quando cerca un nome qualsiasi . Una direttiva using namespace
inizia con l' using namespace
.
Una dichiarazione d'uso è anche distinta da una dichiarazione di alias, che dà un nuovo nome ad un tipo esistente allo stesso modo di typedef
. Una dichiarazione alias contiene un segno di uguale.
Importazione di nomi individuali da uno spazio dei nomi
Una volta using
viene utilizzato per introdurre il nome cout
dallo spazio dei nomi std
nello scope della funzione main
, l'oggetto std::cout
può essere indicato come cout
alone.
#include <iostream>
int main() {
using std::cout;
cout << "Hello, world!\n";
}
Riconoscere i membri di una classe base per evitare l'occultamento del nome
Se una dichiarazione di utilizzo si verifica nell'ambito della classe, è consentito solo ridichiarare un membro di una classe base. Ad esempio, l' using std::cout
non è consentito nell'ambito della classe.
Spesso, il nome redeclared è uno che altrimenti sarebbe nascosto. Ad esempio, nel codice seguente, d1.foo
fa riferimento solo a Derived1::foo(const char*)
e si verificherà un errore di compilazione. La funzione Base::foo(int)
è nascosta e non viene considerata affatto. Tuttavia, d2.foo(42)
va bene perché la dichiarazione using porta Base::foo(int)
nell'insieme di entità denominate foo
in Derived2
. Nome ricerca trova quindi sia foo
s e la risoluzione di sovraccarico seleziona Base::foo
.
struct Base {
void foo(int);
};
struct Derived1 : Base {
void foo(const char*);
};
struct Derived2 : Base {
using Base::foo;
void foo(const char*);
};
int main() {
Derived1 d1;
d1.foo(42); // error
Derived2 d2;
d2.foo(42); // OK
}
Costruttori ereditari
Come caso speciale, una dichiarazione di utilizzo nell'ambito della classe può fare riferimento ai costruttori di una classe di base diretta. Questi costruttori vengono quindi ereditati dalla classe derivata e possono essere utilizzati per inizializzare la classe derivata.
struct Base {
Base(int x, const char* s);
};
struct Derived1 : Base {
Derived1(int x, const char* s) : Base(x, s) {}
};
struct Derived2 : Base {
using Base::Base;
};
int main() {
Derived1 d1(42, "Hello, world");
Derived2 d2(42, "Hello, world");
}
Nel codice precedente, sia Derived1
che Derived2
hanno costruttori che inoltrano gli argomenti direttamente al costruttore corrispondente di Base
. Derived1
esegue esplicitamente l'inoltro, mentre Derived2
, utilizzando la funzione C ++ 11 dei costruttori ereditari, lo fa in modo implicito.