클래스 정적 변수 초기화 순서
두 개의 정적 변수가있는 클래스 A가 있습니다. 다음과 같이 관련없는 다른 정적 변수로 하나를 초기화하고 싶습니다.
#include <iostream>
class A
{
public:
static int a;
static int b;
};
int A::a = 200;
int a = 100;
int A::b = a;
int main(int argc, char* argv[])
{
std::cout << A::b << std::endl;
return 0;
}
출력은 200입니다. 그래서 누구든지 이유를 말해 줄 수 있습니까?
조회 규칙에 따르면 맞습니다. [basic.lookup.unqual] / 13 내용 :
X 클래스의 정적 데이터 멤버 정의에 사용 된 이름 (정적 멤버의 정규화 된 ID 뒤)은 이름이 X의 멤버 함수에서 사용 된 것처럼 조회됩니다. [참고 : [class.static.data ]는 정적 데이터 멤버 정의에서 이름 사용에 대한 제한 사항을 자세히 설명합니다. — 끝 참고]
정규화되지 않은 항목 a
은 마치 멤버 함수 내부에있는 것처럼 조회 되므로A::a
먼저 멤버를 찾아야합니다 . 의 초기화 순서 A::a
와는 A::b
그 결과가 얼마나 잘 정의에 영향을하지만, 조회에 영향을주지 않습니다.
그래서 누구든지 이유를 말해 줄 수 있습니까?
이것은 basic.scope.class / 4 에 명확하게 명시되어 있습니다 .
클래스 정의의 끝까지 또는 그 이후로 확장되는 선언 의 잠재적 범위 는 멤버가 클래스 외부에서 어휘 적으로 정의 된 경우에도 해당 멤버 정의에 의해 정의 된 영역으로 확장됩니다 ( 여기에는 정적 데이터 멤버 정의 , 중첩 클래스 정의, 및 멤버 함수 본문 및 declarator-id 뒤에 오는 선언자 부분의 일부를 포함하는 멤버 함수 정의 (파라미터 선언 절 및 기본 인수 포함).
따라서
int A::a = 200;
int a = 100;
int A::b = a; // note the '::' scope resolution operator
// OUTPUT: 200
a
사실을 의미 A::a
때문에 클래스 범위가 됩니다 확장 에 의해 A::b
.
다음과 같은 경우와 달리 :
int A::a = 200;
int a = 100;
int b = a; // note b is not A::b
// i.e. without the '::', scope resolution operator
// OUTPUT: 100
a
제 (글로벌)를 참조 것 ::a
때문에 b
여기 것은의 구성원이 아닌 class A
,
즉 어떤 클래스 범위 확장.
적정-ID를 회원의 선언자-ID 다음 고정 부재의 정의에서 사용되는 경우 , 및 ([basic.lookup.unqual]) 발견을 조회 이름 비정규-ID는 고정 부재에 참조하는 , 계수기, 또는 중첩 형 멤버 클래스 (또는 멤버 클래스의 기본 클래스) 의 unqualified-id는 nested-name-specifier가 멤버가 참조되는 클래스 범위의 이름을 지정 하는 정규화 된 ID 표현식으로 변환됩니다 . [참고 : 비 정적 데이터 멤버 및 비 정적 멤버 함수 사용에 대한 제한 사항은 [expr.prim.id]를 참조하십시오. — 끝 참고]
그것은 당신의 상황에서 unqualified-id가 정규화 된 id 표현으로 변환된다고 말합니다.
int A::b = a;
규정 된 ID를 설정할 수 있지만 이와 같은 중첩 이름 지정자가 없습니다.
int A::b = ::a;
이름 조회 a
는 A::a
. 이렇게하려면 범위를 수동으로 해결해야합니다.
int A::b = ::a;
// ^ Global scope resolution
참고 URL : https://stackoverflow.com/questions/51279270/class-static-variable-initialization-order
'programing tip' 카테고리의 다른 글
Android Lollipop에서 Notification.Builder.setSmallIcon으로 설정된 아이콘이 흰색 사각형으로 표시되는 이유는 무엇입니까? (0) | 2020.12.02 |
---|---|
Docker의 기본 WORKDIR은 무엇입니까? (0) | 2020.12.02 |
높은 수준의 단위 테스트 및 모의 개체의 가치 (0) | 2020.12.02 |
Mysysgit“(END)”가 표시됩니다. 어떻게 진행합니까? (0) | 2020.12.02 |
Scala : "any"및 "all"함수 (0) | 2020.12.01 |