본문 바로가기
프로그래밍/C++

const 위치에 따른 동작

by 호군 2010. 11. 12.
반응형

C++ 언어에서 const는 "constant"의 약자로 "변함없는" 이라는 뜻을 가지고 있습니다.
즉, const는 변수를 상수화 시킬 때 사용되어 지고, C++에서 제공하는 키워드 입니다.

아래 소스코드는 const의 위치에 따른 동작에 대해서 설명하고 있습니다.

class의 맴버함수에서 모든 위치에 const를 사용한 예로 보자면,
const char* Function( const char* const  szMessage) const
와 같을 수 있습니다.
왼쪽의 const부터 본다면, 첫번째 const는 반환값에 대한 상수화입니다. 값을 반환 받으려면, 꼭 const 타입으로 받아야 한다는 것으로 사용 범위를 제한 하는 것입니다.
두번째 const는 해당 포인터가 가르키는 대상을 상수화하는 것입니다. 그래서 해당 포인터변수는 다른 변수를 가르킬 수는 있지만 그 포인터가 가르키는 대상은 변경 할 수 없습니다.
세번째 const는 해당 포인터를 상수화 하는 것입니다. 그래서 해당 포인터 변수는 다른 변수를 가르킬 수 없습니다. 하지만 가르키고 있는 대상의 값은 변경이 가능 합니다.
네번째 const는 반환 되는 포인터가 가르키는 대상을 상수화 하는 것입니다. 그래서 반환 받은 포인터 변수는 다른 변수를 가르킬 수 있습니다. 하지만 반환 받은 포인터 변수가 가르키는 대상은 변경 할 수 없습니다.

아래 코드를 컴파일을 해보면, 오류가 발생하는 줄(line)을 보면 알 수 있습니다.

- 소스코드
class CTest
{
public:
    char* Function1( const char* szMessage) 
    {
        szMessage[0] = 't'; //애러 발생
        return m_szMessage;
    }
    char* Function2( char* const szMessage)  
    {    
        szMessage = m_szMessage; //애러 발생
        return m_szMessage;
    }
    char* Function3( char* szMessage) const 
    {
        m_szMessage = szMessage; //애러 발생
        return m_szMessage;  
    }
    const char* Function4( char* szMessage)  
    {
        m_szMessage = szMessage;
        return m_szMessage; //반환 받는 타입이 const가 아닐 경우 애러 발생
    }
private:
    char* m_szMessage;
};
int main(int argc, char* argv[])
{
 CTest test;
 charszMessage[] = "hello, const!";
 
 test.Function1(szMessage);
 test.Function2(szMessage);
 test.Function3(szMessage);

 const char* pMessage = test.Function4(szMessage);
 pMessage[0] = 0; //애러 발생

 return 0;
}
반응형