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

C ++ 11

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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow