C ++ 구문 "A :: B : A {};"는 무엇입니까? 평균
C ++ 구문 struct A::B:A {};
은 무엇을 의미합니까? C ++ 표준에서이 이름 정의 (또는 액세스)는 어디에 설명되어 있습니까?
#include <iostream>
struct B;
struct A {
struct B;
};
struct A::B:A {
};
int main() {
A::B::A::B b;
std::cout<<"Sizeof A::B::A::B is " << sizeof(A::B::A::B)<<std::endl;
return 0;
}
이 정의
struct A {
struct B;
};
A
중첩 된 struct B
1 선언으로 struct 를 정의합니다 . 의 완전한 이름 B
입니다 A::B
당신은 말할 수, B
의 "네임 스페이스"내부입니다 A
. 다음은 :
struct A::B : A { // Note I added spaces
};
의 정의인가 A::B
하고 하나 :
가되어 지정 파생 에서 A
.
이제 흥미로운 부분은 A::B::A::B
. 해부 해 보겠습니다.
A::B
중첩 된 구조의 이름을 지정합니다.A::B::A
A
내부에 삽입 된 클래스 이름에 액세스합니다B
. 주입은 상속 때문입니다.A::B::A::B
중첩 된 구조의 이름B
을A
다시 지정합니다.
그리고 ad-infinitum을 계속하거나 적어도 컴파일러가 번역 제한 2를 충족 할 때까지 계속할 수 있습니다 .
재미있는 지적 연습이지만 실제 코드의 전염병처럼 피하십시오.
[class.qual] / 1 은 조회 작동 방식을 설명합니다.
는 IF 중첩 된 이름 지정 (A)의 자격을 갖춘-ID가 클래스를 지명은 후 지정된 이름 중첩 된 이름 지정은 나와있는 경우를 제외하고, 클래스 ([class.member.lookup])의 범위에 조회됩니다 이하. 이름은 해당 클래스 또는 기본 클래스 중 하나의 멤버를 하나 이상 나타냅니다 (Clause [class.derived]).
위의 텍스트는 [class] / 2 때문에 기본 클래스의 이름을 지정할 수 있습니다.
클래스 이름은 또한 클래스 자체의 범위 내로 삽입된다; 이것은 injected-class-name 으로 알려져 있습니다. 액세스 검사를 위해 삽입 된 클래스 이름 은 공용 멤버 이름 인 것처럼 처리됩니다.
위의 내용은 정규화 된 이름을 시작 A::
하면 멤버 또는 기본 클래스를 지정할 수 있음을 분명히 말합니다 . 이후 A
에는 기지가 없습니다 만 지정할 수 있습니다 A::B
(에 "회원 유형을"). 그러나 A::B
또한 클래스를 지명합니다. 우리의 기본 또는 멤버 지정할 수 있도록 그 뿐만 아니라와 A::B::
우리가 이름을 지정할 수 있습니다, A::B::A
. 이제 헹구고 반복하십시오.
1- 완전히 다른 것 B
입니다. 전역과 전혀 관련이 없습니다 struct B
.
2- [implimits] /2.36 에 따라 권장되는 최소 256 개
우선 글로벌 네임 스페이스에서 struct B;
struct의 포워드 선언입니다 B
. 이 예제에서는 실제로 관련이 없기 때문에 혼란 스러울 수 있습니다. 이 전역 B
은 ::B
또는로 액세스 할 수 있습니다 B
.
struct A {
struct B;
};
중첩 된 구조체 A
의 포워드 선언이있는 전역 네임 스페이스 의 구조체 정의입니다 (이전 에 전역 네임 스페이스에서 선언 된 것과 동일하지 않음 ). 이 중첩 은 또는 로 액세스 할 수 있습니다 .B
B
B
::A::B
A::B
struct A::B:A {
};
Is a definition of nested struct B
of struct A
that inherits from A
(with access specifier omitted). It can be rewritten to:
struct A::B
: public A
{
};
Note that writing definition of nested struct B
inside of A
definition like this won't work:
struct A {
struct B: A { // error: A is incomplete at this point
};
};
And finally A::B::A
is referring to the base class of nested struct B
, that is to A
, so A::B::A::B
is equivalent to just A::B
.
참고URL : https://stackoverflow.com/questions/47546616/what-does-c-syntax-aba-mean
'code' 카테고리의 다른 글
MySql Workbench의 테이블 데이터를 CSV로 내보내는 방법은 무엇입니까? (0) | 2020.11.20 |
---|---|
JSHint에서 camelcase 변수 무시 (0) | 2020.11.20 |
VB.NET의 '그림자'대 '재정의' (0) | 2020.11.20 |
.Net 이전 vb left (string, length) 함수와 동일합니까? (0) | 2020.11.20 |
Visual Studio가 배치 파일에 잘못된 문자를 삽입합니다. (0) | 2020.11.20 |