2014년 1월 28일 화요일

const 위치와 의미

자주 사용하지만, 항상 뭔가 헤깔리는 그런것들이 있는데, const 도 그런 것들 중에 하나입니다. (저만 그럴지도...)
위치에 따른 const 의미를 정리해 보았습니다.

/**
 * @brief 
**/
class ConstPositionTest
{
public: 
    //> (const char*) msg : char* 가 const, 즉 msg 가 가리키는 데이터 변경 불가
    char* Function1(const char* msg)  
    {
        msg[0] = 't'; // error
        return m_msg;
    }

    //> char* (const msg) : msg 변수가 const, 즉 msg 포인터 변수 변경 불가
    char* Function2(char* const msg)  
    {    
        msg = m_msg; //error
        return m_msg;
    }

    //> 메소드 상수화, 이 메소드는 클래스 멤버를 읽을 수는 있으나 변경 할 수는 없음
    char* Function3(char* msg) const 
    {
        m_msg = msg; //error
        return m_msg;  
    }

    //> (const char*) : 리턴 값이 const char* 이므로 리턴 받는 변수도 const char* 이어야 함
    //> 따라서 리턴되는 포인터가 가리키는 데이터 변경 불가
    const char* Function4(char* msg)  
    {
        m_msg = msg;
        return m_msg; //반환 받는 타입이 const가 아닐 경우 error
    }
private:
    char* m_msg;
};

/**
 * @brief 
 * @param 
 * @see  
 * @remarks 
 * @code  
 * @endcode 
 * @return 
**/
bool test_const_position()
{
    ConstPositionTest test;
    char msg[] = "hello, const!";
 
    test.Function1(msg);
    test.Function2(msg);
    test.Function3(msg);

    const char* pMessage = test.Function4(msg);
    pMessage[0] = 0; // error
}