10

정적 멤버가있는 클래스가 있습니다. 이것은 같은 클래스의 private static 함수를 사용해 초기화됩니다.정적 구성원 초기화 중 개인 정적 함수에 대한 액세스

#include <iostream> 
#include <string> 

class A 
{ 
public: 
    static std::string const s; 

private: 
    static std::string make() 
    { 
     return "S"; 
    } 
}; 

std::string const A::s = A::make(); 

int main() 
{ 
    std::cout << A::s << std::endl; 
    // std::cout << A::make() << std::endl; // <-- Does not work 
    return 0; 
} 

내 질문 : 어떤 규칙이 허용 되었습니까? 클래스 외부의 개인 함수에 액세스 할 수 없으므로 분명히 주석 부분이 작동하지 않습니다. 그렇다면 왜 스타트 업 중에 private static 멤버의 초기화가 특별한 경우입니까? (그리고이 메모의 의도는 무엇입니까?이 정확한 경우를 허용할까요?)

고정 멤버를 초기화하는 다른 메커니즘 (예 : Initializing private static members)을 알고 있습니다. 그러나 제 경우에는 구성원이 const입니다. 그래서 제가 설정하는 유일한 방법은 정의의 장소에서 직접적인 초기화를 통해서라는 것입니다.

답변

8

정적 데이터 멤버가 네임 스페이스 범위 (클래스 정의 외부)에 정의되어 있더라도 정적 데이터 멤버의 초기화는 클래스 특성화의 일부로 간주되기 때문입니다. 표준에서

, $9.2.3.2/2 Static data members [class.static.data] : 정적 데이터 멤버의 정의

(강조 광산)

이니셜 식 동급 ([basic.scope의 범위에있다. 수업]).

[예 :

class process { 
    static process* run_chain; 
    static process* running; 
}; 

process* process::running = get_main(); 
process* process::run_chain = running; 

클래스 processrun_chain 글로벌 범위에 정의 된 정적 데이터 부재; process::run_chain 표기법은 회원 run_chain이 클래스 process의 구성원이고 클래스 process의 범위임을 지정합니다. 정적 데이터 멤버 정의에서 표현식은 process 클래스의 정적 데이터 멤버 running을 나타냅니다. - 최종 예]

+1

const에 관한 내용은 맞습니다. 질문을 수정했습니다. 감사. –

+1

"정적 데이터 멤버의 초기화는 정적 데이터 멤버가 네임 스페이스 범위 (클래스 정의 외부)에서 정의 되더라도 클래스의 특성화의 일부로 간주됩니다."라고 분명히 생각합니다. ("클래스 정의"는 C++ 표준에서 매우 공식적인 의미가 있기 때문에 "특성화"를 사용했습니다.) –

+0

@MartinBonner Fine. – songyuanyao