Item3_낌새만 보이면 const를 들이대보자
챕터 핵심 내용
const
를 붙여 선언하면 컴파일러가 사용상의 에러를 잡아내는 데 도움을 준다.- 컴파일러 쪽에서 보면 비트수준 상수성을 지켜야 하지만, 우리는 개념적인(논리적인) 상수성을 사용해서 프로그래밍 해야한다.
- 상수 멤버 및 비상수 멤버 함수가 기능적으로 서로 똑같게 구현되어 있을 경우에, 코드 중복을 피하고 싶다면 비상수 버전이 상수 버전을 호출하게 하라.
const
를 사용할 수 있는 곳에는 적극 활용하자.- 의도치 않은 오류를 잡아내는 데 많은 도움을 준다.
class Rational { ... };
const Rational operator*(const Rational& lhs, const Rational& rhs);
Rational a, b, c;
(a * b) = c
- 비트수준 상수성(물리적 상수성) : 어떤 멤버 함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야 상수 멤버 함수임을 인정하는 특성
- 논리적 상수성 : 상수 멤버 함수라고 객체의 한 비트도 수정할 수 없는 것이 아니라, 일부 몇 비트는 바뀔 수 있되, 그것을 사용자측에서 알아채지 못하게만 하면 된다는 특성
mutable
을 이용하면 상수 멤버 함수에서도 값이 바뀔 수 있다.
class TextWatcher
{
...
public:
const char& operator[](std::size_t pos) const
{
return mText[pos];
}
char& operator[](std::size_t pos)
{
return const_cast<char&>
(static_cast<const TextWatcher&>(*this)[pos]);
}
};