본문 바로가기
Programming/C & C++

Class 내의 const static 멤버의 초기화 위치 - 출처 : 채현님 블로그

by leanu 2008. 7. 7.

Why I wrote this page?
--------------------------------------------------------------------------------------
const char* 형을 클래스 내부에 static 으로 가지고 있으려고 했는데, 오류를 해결하려고 오랜시간을 보낸결과 정리가 잘되어있는 블로그를 발견하고 이를 해결하였다. 약간 정리 하여 아래에 기술해본다. 채현님께서도 해깔린다고 했는데, 다음에 또 해깔리겠군 ㅡ.ㅡ;


Description
--------------------------------------------------------------------------------------
1. 클래스 내의 모든 static member variables는 모든 block의 밖에서 선언되어야 한다. 만약 초기화를 하지 않으면 0으로 자동 초기화 된다.

class Widget
{
        static int n;
}

int Widget::n = 0;


2. const member variable은 생성자에서 초기화 해주어야 한다.

class Widget
{
public:
         Widget() : n(0) {};
        const int n;
}


3. const static variable이 integer type인경우 선언과 동시에 초기화가 가능하지만 non-integer type인 경우 클래스 밖에서 초기화 해야 한다.

(주의) 밖에서 선언하는 경우 클래스이름.cpp 안에 기술해야 하며, 다른 파일에 기록하는 경우 반드시 클래스이름.cpp에서 include를 해야 한다.
class Widget
{
        static const int MAX = 512;
        static const char flag = 'a';
        static const char str1[3][15];
        static const std::string msg;
};

const char Widget::str1[3][15] = {"Hello", "I'm", "happy."};
const std::string Widget::msg = "Are you?";

4. class 내의 static member function은 member variable을 변경할 수 없다는 접미어 const를 쓸 수 없다. 아래의 예처럼 말이다.

class Test
{
        static bool isEmpty() const;     // Compile- error
};

 static member function은 class의 인스턴스가 생성되지 않아도 사용 가능하다. 즉 이렇게도 사용가능하단 말인데...

        Test::isEmpty();

이는 특정 instance에 종속되지 않는다는 것을 의미한다. 
(instance 선언 유무와는 무관하게 이미 isEmpty()영역은 별도로 잡아놓았다는 말이다.)

인자로 넘겨주지 않는 한 isEmpty()는 static형을 제외한 클래스의 모든 member variable을 읽을수 없고,

따라서 const 는 컴파일 에러를 발생시키는 것이다.

const 를 못쓰는 이유를 알았으니, 이런 종류의 member function을 코딩할 때,

그 안에 member variable을 포함시키는 실수는 범하지 않으리라 생각한다.
(어차피 컴파일 에러가 나긴 한다.)

-----------------------------------------------------------------------
출처 : 채현님의 블로그 (http://xlos.tistory.com/869)

'Programming > C & C++' 카테고리의 다른 글

C++ Casting 관련 (it needs code test)  (2) 2008.09.17
Implementation시 자주 하는 실수들  (0) 2008.09.02
define 관련 재미있는 사용법  (0) 2008.05.06
STL Sample Codes  (0) 2008.04.28
Unit Test - C Unit  (0) 2008.03.13

댓글