C와 C++에서의 const 차이점

 
우연히(?) Qmail을 설치하려구..

KLDP를 돌아다니가다..

좋은글이 있어서리. 퍼왔당..

특히.. const 위치에 따른 의미변화..

이건 예전에 알긴 했는데.. 다 까묵어서리.. 다시 보는 좋은 기회가 된듯..


------ 

C 언어와 C++ 언어에서 'const' 처리는 조금 다릅니다.

일단 C 언어의 경우, 32, 012, 0x3 등은 정수 상수입니다 (integer constant). 또는 정수 상수식 (integer constant expression)이라고도 합니다. 가변 배열을 제외하고, 배열 크기를 써 준다거나, struct bit-field로 지정할 수 있는 수치는 모두 정수 상수식이어야 합니다.

const int ci = 3

에서, 변수 ci의 타입은 const int입니다. 보통 이런 식으로 'const'가 붙은 타입을 const-qualified type이라고 합니다. 그리고 const-qualified type의 오브젝트는 정수 상수가 아닙니다. 따라서 (가변 배열을 제외하고) 배열의 크기를 지정할 때 ci를 쓴다거나, case 레이블로 쓸 수 없습니다.

C++ 언어 경우, 정수 상수, 정수 상수식 등은 C 언어와 같습니다. 단. const-qualified type의 오브젝트는 정수 상수가 됩니다. 따라서 const int 등으로 선언한 것도 정수 상수 취급을 받아서 배열의 크기를 지정한다거나 case 레이블로 쓸 수 있습니다.

const가 붙은 오브젝트... 말이 좀 이상하죠? 아무리 생각해 봐도 좀 더 나은 표현은 "처음 값을 지정할 때를 제외하고 값을 변경할 수 없는 오브젝트"가 더 나은 표현일 것 같긴 한데.. 그렇다고 상수라고 표현하기 곤란한 게, 이것과 정수 상수와는 전혀 다른 뜻이기 때문에...

또, C/C++ 모두, const-qualified type으로 선언한 변수는 직/간접적으로 그 값을 변경하면 안됩니다. 이는 undefined behavior에 속합니다. 다음과 같은 코드를 보면 무슨 말인지 쉽게 알 수 있을 것입니다:


const int i = 3;
int *p = (int *)&i;
*p = 4; /* wrong: undefined behavior */

여담으로 C++에서 위와 같이 C 스타일 타입 변환보다, const_cast를 쓰는 것이 더 바람직합니다.

포인터 선언할 때, const의 위치에 따라서 다양한 종류가 나올 수 있습니다.


1. const int *cip (또는 int const *ip)
2. int * const icp
3. const int * const cicp (또는 int const * const ip)

첫번째는 const int를 가리키는 포인터 ip입니다. 즉 const qualified int (값을 바꿀 수 없는 정수 타입)을 가리키는 포인터입니다. 이 포인터는 얼마든지 다른 const int를 가리키도록 바꿀 수 있지만, 가리키고 있는 대상의 값을 바꿀 수는 없습니다.


const int ci1 = 4, ci2 = 8;
const int *cip = &ci1;
cip = &ci2; /* ok */
*cip = 0; /* wrong */

두번째는 일반 정수 타입 int를 가리키는 const 포인터입니다. 즉, 가리키는 대상이 int이기 때문에, 얼마든지 값을 변경할 수 있지만, 포인터 자체가 const이기 때문에 다른 int를 가리키도록 바꿀 수 없습니다.


int i1 = 4, i2 = 8;
int * const icp = &i1;
icp = &i2; /* wrong */
*icp = 0; /* ok */

세번째는 const int를 가리키는 const 포인터입니다. 따라서 다른 대상을 가리키도록 포인터를 바꿀 수도 없고, 대상이 가지고 있는 값을 바꿀 수도 없습니다.


const int ci1 = 3, ci2 = 4;
const int * const cicp = &ci1;
cicp = &ci2; /* wrong */
*cicp = 0; /* wrong */

by 역시나야 | 2006/03/10 14:29 | UNPv2 | 트랙백 | 덧글(3)

트랙백 주소 : http://spanthoma.egloos.com/tb/1279027
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by Sigel at 2006/03/15 09:45
앗... 이런 정보가...@_@ 처음 알았어요...
그리고 결심했어요... 계속 자바 개발만 할래요...ㅜㅜ
Commented by Robert at 2007/04/06 01:29
nice
Commented by Naomi at 2007/04/06 01:54
hello

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶