항목 3 : 낌새만 보이면 const를 들이대 보자!
const는 ‘의미적인 제약’(const가 붙은 객체는 외부 변경 불가)을 소스 코드 수준에서 붙일수 있고 이를 컴파일러가 단단히 지켜 준다. 어떤 값이 불변이어야 한다면 제작자의 의도를 컴파일러와 다른 프로그래머와 나눌수 있는 수단이기 때문에 지키도록 하자.
char greeting[] = "Hello";
char *p = greeting; // 비상수 포인터, 비상수 데이터
const char *p = greeting; // 비상수 포인터, 상수 데이터
char *const p = greeting; // 상수 포인터, 비상수 데이터
const char * const p = greeting; // 상수 포인터, 상수 데이터
const 키워드가 *표의 왼쪽에 있으면 포인터가 가리키는 대상이 상수, const가 *표의 오른쪽에 있는 경우에 포인터 자체가 상수이다.
const의 강력한 용도중의 하나는 함수의 선언에 쓸 경우이다. 함수의 반환 값, 매개 변수, 멤버 함수 앞 등에 붙일 수 있다. 매개 변수, 지역변수가 수정할게 없는 목적이면 반드시 const를 붙이자.
상수 멤버 함수
멤버 함수에 붙이는 const의 역할은 “해당 멤버 함수가 상수 객체에 대해 호출 될 함수이다”라는 사실을 알려주는 것이다. 상수 멤버 함수가 중요한 이유는 아래와 같다.
- 인터페이스를 이해하기 좋게 하기 위해서, 클래스로 만들어진 객체를 변결 할 수 있는 함수는 무엇이고, 변경할 수 없는 함수는 무엇인지 사용자 알고 있어야 한다.
- 상수 객체를 사용할 수 있게 하자는 것, 성능을 높이는 핵심 기법 중 하나인 객체 전달을 상수 객체에 대한 참조자(reference-to-const) 항목20 에서의 필요하다.
const 키워드의 차이로 함수 오버로딩도 가능하다.
어떤 멤버 함수가 상수 멤버라는 것은 어떤 의미일까?
- 비트수준 상수성 ( bitwise constness ) - 물리적 상수성 ( physical constness ) : 객체의 어떤 멤버도 건드리지 않아야 한다.
- 논리적 상수성 ( logical constness ) : 비트 수준 상수성라 해도 벗어 나는 동작이 가능하다. 그래서 이러한 동작에 대해 상수라 해도 사용자가 눈치 못체게 몇비트 정도는 바꿀 수 있다는 개념으로 mutable 등의 비정적 데이터를 사용하여 상수성을 바꿔서 사용하자는 개념.