이를 이해하려면, 당신은 compiling and linking 잘 이해하고 declarations and definitions의 차이점을 가져야한다. 여기
//In header file
class Example {
static bool exampleStaticMember;
};
이 exampleStaticMember
가 선언되었지만 정의되지 않은 :
은 다음 클래스를 생각해 보자. 즉,
exampleStaticMember
이 주소가 있어야 함을 의미하는 경우 별도의 정의가 있어야합니다. 일반적으로 클래스 정의에서 정적 데이터 멤버 선언은 해당 멤버의 정의입니다.
필수 선언은 일반적으로 클래스 구성원에 대한 다른 정의가 들어있는 cpp 파일에 있습니다. 클래스 정의와 동일한 네임 스페이스에 있어야합니다. 정의는 어떤 CPP 파일에 넣을 수
//In source file:
//This may optionally have an initialiser (eg "= true")
bool Example::exampleStaticMember;
하지만이 One Definition Rule 깰 가능성이있을 것이기 때문에 그것은, 클래스와 헤더에 넣어해서는 안 : 정의는 일반적으로처럼 보인다. 정적 멤버 변수가 CONST 정수 또는 열거 형이면 특별한 경우로
는, 다음 클래스 정의의 initialiser 가질 수있다 :이 경우
//In header file
class Example {
static const int initialised = 15;
};
를 상기 CPP 파일의 정의는 여전히 필요하지만 이니셜 라이저는 사용할 수 없습니다.
상수 표현식에서 이처럼 초기화 된 정적 멤버를 사용할 수 있습니다.
템플릿 템플릿 정적 데이터 멤버
는 일이 약간 다르다. 정적 멤버는 클래스의 나머지와 함께 헤더에 정의되어야한다 : 클래스 템플릿의 정적 데이터 멤버에 대한 하나의 정의 규칙에 고유의 예외가 있기 때문에
//In header file
template<typename T>
class Example {
static int exampleInt;
static T exampleT;
}
template<typename T> int Example<T>::exampleInt;
template<typename T> T Example<T>::exampleT;
이 작동합니다.static
키워드는 매우 다른 의미를 취할 수있는 클래스 범위에없는 기능과 개체에 적용되는 정적
의
다른 용도.
함수 범위의 개체에 적용하면 함수를 처음 실행했을 때 초기화 된 개체가 선언되고 함수 호출간에 값이 계속 유지됩니다.
네임 스페이스 범위 (클래스 또는 함수 정의 외부에있는)의 개체 나 함수에 적용하면 internal linkage으로 개체 또는 함수가 선언됩니다. unnamed-namespace이 더 나은 대안을 제공하기 때문에 객체에 대해서는이 사용법이 사용되지 않습니다.
http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.12 – PlasmaHH