2014-07-10 4 views
0

왜 정적 데이터 멤버의 기본 초기화가 발생하지 않습니까? 우리가 data_member m에서 static 지정을 삭제하면 다음 예에서정적 데이터 멤버 초기화

struct data_member 
{ 
    data_member(){ cout << "data_member\n"; } 
    ~data_member(){ cout << "~data_member\n"; } 
}; 

struct Y 
{ 
    static data_member m; 
    Y(){ cout << "Y\n"; } 
    ~Y(){ cout << "~Y\n"; } 
}; 

Y y; //call constructor of Y 

하지만 기본 초기화 될 것입니다.

struct data_member 
{ 
    data_member(){ cout << "data_member\n"; } 
    ~data_member(){ cout << "~data_member\n"; } 
}; 

struct Y 
{ 
    data_member m; 
    Y(){ cout << "Y\n"; } 
    ~Y(){ cout << "~Y\n"; } 
}; 

Y y; //call Y() and data_member() 
+6

당신은'm'에 대한 정의를 제공하지 않았기 때문에. –

+0

@CaptainObvlious 9.4.2/6 : _ 정적 데이터 멤버는 초기화되지 않고 비 로컬 변수와 똑같이 파괴됩니다. 이는 기본 초기화가 수행되어야 함을 의미합니다. –

+3

당신이 해보지 못한 정의를 제공하는 한 말 그대로입니다. –

답변

3

정적 멤버는 클래스 정의 외부에서 정의해야합니다. 그 시간에 초기화됩니다 (기본값으로 초기화 될 수도 있음).

구성원 변수에 대한 초안 표준의 다음 설명은 클래스 선언에서 기본적으로 초기화되지 않은 이유를 설명해야합니다.

9.4.2 정적 데이터 멤버

2의 클래스 정의에 static 데이터 부재의 선언은 정의되지 않으며 이외의 불완전한 형일 수도 CV 수식 void. static 데이터 멤버에 대한 정의는 멤버의 클래스 정의를 둘러싸는 네임 스페이스 범위에 나타납니다. 네임 스페이스 범위의 정의에서, static 데이터 멤버의 이름은 :: 연산자를 사용하여 클래스 이름으로 정규화됩니다.

2

static 데이터 멤버는 class 정의에 선언 있습니다. 그들은 일반적으로 해당 cpp 파일에서 그의 (한 번) 외부를 정의 할 필요가 : 당신이라는 기본 ctor에의 참조 볼 수있는 곳

data_member Y::m; 

이있다.

2
struct Y 
{ 
    static data_member m; 
    Y(){ cout << "Y\n"; } 
    ~Y(){ cout << "~Y\n"; } 
}; 

에만 m를 선언합니다. 모든 컴파일러는 Y::m이 다른 번역 단위로 정의되어 있음을 알고 있습니다. 정적 데이터 멤버는 클래스 당 하나이므로 클래스를 정의하지 않고 선언 할 수 있어야합니다. 그렇지 않으면 헤더를 포함 할 때 One Definition Rule을 위반하지 않고 클래스 정의를 헤더 파일에 넣을 수 없습니다. 다른 번역 단위.

data_member Y::m; 

이것은 m 및 will cause a constructor call을 정의합니다.

0

기본 대답 : 클래스 멤버는 기능이 비슷합니다. 선언과 정의가 있습니다. 당신은 그들의 존재를 @class 수준으로 "선언"하고 "정의"는 생성자에 의해 만들어집니다. 정적 멤버가 더 복잡합니다. 그것들은 "인스턴스 관련"이 아니며 생성자는 이들을 "정의"하지 않습니다. 수업 외부에서 직접해야합니다.

Type CLASS::member; 

bt 정적 멤버를 사용하는 것이 좋습니다.

대신 정적 기능을 사용

class Foo{ 
public: 
    Type &getMember(){ 
     static Type member; 
     return member; 
    } 
}; 
관련 문제