C++
Korzystanie z deklaracji
Szukaj…
Wprowadzenie
Deklaracja using
wprowadza pojedynczą nazwę do bieżącego zakresu, który został wcześniej zadeklarowany w innym miejscu.
Składnia
- przy użyciu typename ( opt ) nested-name-specifier unqualified-id ;
- using :: unqualified-id ;
Uwagi
Deklaracja użycia różni się od dyrektywy używającej , która mówi kompilatorowi, aby szukał określonej przestrzeni nazw podczas wyszukiwania dowolnej nazwy. Dyrektywa using namespace
zaczyna się od using namespace
.
Deklaracja użycia różni się również od deklaracji aliasu, która nadaje istniejącemu typowi nową nazwę w taki sam sposób jak typedef
. Deklaracja aliasu zawiera znak równości.
Importowanie nazw indywidualnie z przestrzeni nazw
Po using
do wprowadzenia nazwy cout
z przestrzeni nazw std
w zakres funkcji main
, obiekt std::cout
można nazwać samym cout
.
#include <iostream>
int main() {
using std::cout;
cout << "Hello, world!\n";
}
Ponownie deklaruj członków z klasy podstawowej, aby uniknąć ukrywania nazw
Jeśli deklaracja użycia występuje w zakresie klasy, dozwolone jest tylko ponowne zadeklarowanie elementu klasy podstawowej. Na przykład using std::cout
nie jest dozwolone w zakresie klasy.
Często nazwa redeclared to nazwa, która w przeciwnym razie byłaby ukryta. Na przykład w poniższym kodzie d1.foo
odnosi się tylko do Derived1::foo(const char*)
i wystąpi błąd kompilacji. Funkcja Base::foo(int)
jest ukryta, w ogóle nie jest brana pod uwagę. Jednak d2.foo(42)
jest w porządku, ponieważ deklaracja użycia przenosi Base::foo(int)
do zbioru jednostek o nazwie foo
w Derived2
. Po wyszukaniu nazwy znajduje się zarówno foo
jak i rozdzielczość przeciążenia wybiera 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
}
Dziedziczenie konstruktorów
W szczególnym przypadku deklaracja użycia w zakresie klasy może odnosić się do konstruktorów bezpośredniej klasy bazowej. Te konstruktory są następnie dziedziczone przez klasę pochodną i można ich użyć do zainicjowania klasy pochodnej.
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");
}
W powyższym kodzie zarówno Derived1
, jak i Derived2
mają konstruktory, które przekazują argumenty bezpośrednio do odpowiedniego konstruktora Base
. Derived1
wykonuje przekazywanie jawnie, podczas gdy Derived2
, korzystając z funkcji C ++ 11 polegającej na dziedziczeniu konstruktorów, robi to domyślnie.