수색…


소개

using 선언은 이전에 다른 곳에서 선언 된 현재 범위에 단일 이름을 도입합니다.

통사론

  • typename ( opt ) 중첩 이름 지정자 unqualified-id 사용 ;
  • 를 사용하여 :: unqualified-id ;

비고

사용하여 A-선언은 별개입니다 using 지시문 어떤 이름을 찾을 때 특정 네임 스페이스에보고하도록 컴파일러에 알려줍니다. using 지시문using namespaceusing 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.fooDerived1::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
}

생성자 상속

C ++ 11

특별한 경우로서, 클래스 스코프에서 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");
}

위의 코드에서 Derived1Derived2 는 모두 인수를 Base 의 해당 생성자에 직접 전달하는 생성자를 사용합니다. Derived1 은 전달을 명시 적으로 수행하지만 Derived2 는 상속되는 생성자의 C ++ 11 기능을 사용하여 암시 적으로 수행합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow