수색…
소개
using
선언은 이전에 다른 곳에서 선언 된 현재 범위에 단일 이름을 도입합니다.
통사론
- typename ( opt ) 중첩 이름 지정자 unqualified-id 사용 ;
- 를 사용하여 :: unqualified-id ;
비고
사용하여 A-선언은 별개입니다 using 지시문 어떤 이름을 찾을 때 특정 네임 스페이스에보고하도록 컴파일러에 알려줍니다. using 지시문 은 using namespace
를 using namespace
시작됩니다.
사용 선언 은 typedef
와 같은 방식으로 기존 유형에 새로운 이름을 부여하는 별명 선언과 구별됩니다. 별칭 선언에는 등호가 포함됩니다.
네임 스페이스에서 개별적으로 이름 가져 오기
using
을 사용하여 네임 스페이스 std
에서 main
함수의 범위로 cout
이라는 이름을 도입하면 std::cout
객체를 cout
단독으로 참조 할 수 있습니다.
#include <iostream>
int main() {
using std::cout;
cout << "Hello, world!\n";
}
이름 숨기기를 피하기 위해 기본 클래스의 멤버를 다시 선언
using 선언 이 클래스 scope에서 발생하면 기본 클래스의 멤버 만 다시 선언 할 수 있습니다. 예를 들어 using std::cout
은 클래스 범위에서 허용되지 않습니다.
흔히 재 선언 한 이름은 그렇지 않으면 숨겨져있는 이름입니다. 예를 들어, 아래 코드에서 d1.foo
는 Derived1::foo(const char*)
만 참조하므로 컴파일 오류가 발생합니다. Base::foo(int)
함수는 전혀 고려되지 않은 채 숨겨져 있습니다. 그러나 사용 선언 은 Derived2
foo
라는 엔티티 집합에 Base::foo(int)
를 가져 d2.foo(42)
때문에 d2.foo(42)
는 Derived2
. Name lookup은 foo
와 overload resolution을 모두 찾고 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
}
생성자 상속
특별한 경우로서, 클래스 스코프에서 using 선언 은 직접 기본 클래스의 생성자를 참조 할 수 있습니다. 이러한 생성자는 파생 클래스에서 상속 되며 파생 클래스를 초기화하는 데 사용할 수 있습니다.
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
는 모두 인수를 Base
의 해당 생성자에 직접 전달하는 생성자를 사용합니다. Derived1
은 전달을 명시 적으로 수행하지만 Derived2
는 상속되는 생성자의 C ++ 11 기능을 사용하여 암시 적으로 수행합니다.