programing tip

클래스 정적 변수 초기화 순서

itbloger 2020. 12. 2. 08:11
반응형

클래스 정적 변수 초기화 순서


두 개의 정적 변수가있는 클래스 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,
즉 어떤 클래스 범위 확장.


c ++ draft / class.static

적정-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;

이름 조회 aA::a. 이렇게하려면 범위를 수동으로 해결해야합니다.

int A::b = ::a;
        // ^ Global scope resolution

라이브 예

참고 URL : https://stackoverflow.com/questions/51279270/class-static-variable-initialization-order

반응형