C++
Использование декларации
Поиск…
Вступление
Объявление using
вводит одно имя в текущую область действия, которая ранее была объявлена в другом месте.
Синтаксис
- using typename ( opt ) nested-name-specifier unqualified-id ;
- использование :: unqualified-id ;
замечания
Объявление- использование отличается от директивы using , которая сообщает компилятору, чтобы он смотрел в определенном пространстве имен при поиске любого имени. Директива-использование начинается с using namespace
.
Объявление- использование также отличается от объявления псевдонима, которое дает новое имя для существующего типа таким же образом, как typedef
. Объявление псевдонима содержит знак равенства.
Импорт имен отдельно из пространства имен
После using
используется для ввода имени cout
из пространства имен std
в область main
функции, объект std::cout
можно называть только cout
.
#include <iostream>
int main() {
using std::cout;
cout << "Hello, world!\n";
}
Повторное использование элементов из базового класса, чтобы избежать скрытия имени
Если в области класса применяется декларация использования, разрешается только переопределять член базового класса. Например, using std::cout
в классе не допускается.
Часто имя, о котором было объявлено, является тем, которое иначе было бы скрыто. Например, в приведенном ниже коде d1.foo
относится только к Derived1::foo(const char*)
и произойдет ошибка компиляции. Функция Base::foo(int)
скрыта вообще не рассматриваемой. Тем не менее, d2.foo(42)
отлично, потому что using-declaration приносит Base::foo(int)
в набор объектов с именем foo
в Derived2
. Затем поиск имени находит и foo
s, и разрешение перегрузки выбирает 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
}
Наследование конструкторов
В качестве специального случая использование-объявления в области класса может ссылаться на конструкторы прямого базового класса. Эти конструкторы затем наследуются производным классом и могут использоваться для инициализации производного класса.
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");
}
В приведенном выше коде обе Derived1
и Derived2
имеют конструкторы, которые Derived2
аргументы непосредственно соответствующему конструктору Base
. Derived1
выполняет переадресацию, а Derived2
, используя функцию C ++ 11 наследующих конструкторов, делает это неявно.