들어가며
다음과 같이 변수가 Const X* const로 선언된 경우 해당 변수는 다른 변수를 point할 수 없다.
Cat guru, bally;
const Cat* const p1 = &bally;
p1 = &guru; // 요 부분이 문제.
g++ 4.8.3에서는 컴파일 시 다음과 같은 에러 메시지를 출력한다.
error: assignment of read-only variable ‘p1’
p1 = &guru;
2개의 const 중 앞의 const는 p1가 point하는 변수의 내용을 변경할 수 없는 것을 의미하고 2번째 const는 p1이 다른 변수를 point하지 못하도록 한다. 즉, 다음과 같이 2번째 const를 없애면 p1은 다른 변수를 point할 수 있다.
Cat guru, bally;
const Cat* p1 = &bally;
p1 = &guru;
그런데 이게 꽤나 헷갈리다. 다음과 같은 code는 동작을 할까?
Cat guru, bally;
Cat const * p1 = &bally;
p1 = &guru;
혹은 다음 code는 어떤가?
Cat guru, bally;
Cat * const p1 = &bally;
p1 = &guru;
const X* const를 해석하는 방법
C++ FAQ를 읽다가 알게된 사실인데, ‘오른쪽에서 왼쪽 방향’으로 해석하면 이해가 쉽다.
예를 들어,
const X* p:p는 pointer 변수인데 X type을 point하며 이 변수는 상수(const)이다. 즉, pointer 자체가const는 아니므로p는 다른 변수를 point할 수 있다.X* const p:p는 상수 pointer 변수이며Xtype을 point한다. ‘상수 pointer’이므로 다른 변수를 point할 수 없다.X에는const가 아니므로p가 point하는 변수의 내용은 변경할 수 있다.X const * p:p는non-constpointer이며,const X를 point한다. 따라서p는 다른 변수를 point할 수 있지만,p가 point하는 변수는 수정할 수 없다.
이 처럼 const X* const p를 right-to-left로 해석하면 p 변수의 특성을 이해하기 쉽다.