반응형
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;
};
{
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;
}
{
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;
}
반응형
'프로그래밍 > C++' 카테고리의 다른 글
비트연산 정리 (1) | 2011.11.21 |
---|---|
printf 출력 서식 (0) | 2011.10.18 |
C 언어 레퍼런스 - localtime 함수 (0) | 2011.10.13 |
[System Call] 메모리 맵 - mmap(), munmap(), msync() (0) | 2011.03.04 |
[C++] 상속 두번째, 세가지 형태의 상속 (private, protected, public) (0) | 2011.03.03 |
매크로 (0) | 2010.12.21 |
Unicode 와 ANSI 문자의 변환을 해주는 매크로 (0) | 2010.12.11 |
가변인자 사용하기 (0) | 2010.11.12 |
함수 포인터 (0) | 2010.11.11 |
C++ 파일 입출력 (0) | 2010.10.27 |