Pointer Constness

const 포인터 잠금 범위

const int*와 int* const는 비슷해 보이지만 잠그는 대상이 다르다. 왼쪽 값을 못 바꾸는지, 포인터 자체를 못 옮기는지 읽어야 한다.

01

const가 붙은 대상을 읽는다

별표 왼쪽의 const는 pointee, 별표 오른쪽의 const는 pointer 변수 자체에 붙는다.

02

수정 권한 축소

함수가 값을 읽기만 한다면 const T* 또는 const T&로 호출자 객체를 보호한다.

03

소유권과 혼동하지 않는다

const pointer도 자원을 소유한다는 뜻은 아니다. 삭제 책임은 다른 타입으로 표현한다.

const int* p
값 읽기 전용 *p = 3은 안 되지만 p = other는 가능하다.
포인터 이동은 허용된다.
int* const p
주소 고정 p = other는 안 되지만 *p = 3은 가능하다.
초기화가 필수다.
const int* const p
둘 다 고정 가리키는 값도, 포인터 변수도 이 경로로는 바꿀 수 없다.
읽기 전용 핸들처럼 보인다.
top-level const
값 자체 const 함수 값 인자에서는 복사되며 외부 호출자에게 큰 의미가 없다.
인터페이스 노출 위치를 본다.

읽기 함수 · 주소 고정 · 소유권 점검

읽기 함수 수정하지 않는 포인터 인자에 const가 붙어 있는가.
주소 고정 포인터 변수를 다른 곳으로 옮기면 안 되는 이유가 있는가.
소유권 const를 소유권 제어처럼 착각하고 있지 않은가.

const 위치

const int* readOnly = &value;
int* const fixedAddress = &value;
const int* const fixedReadOnly = &value;