카테고리 없음
[Effective C++] Item3_낌새만 보이면 const를 들이대보자
해달
2018. 1. 24. 21:24
Item3_낌새만 보이면 const를 들이대보자
챕터 핵심 내용
const
를 붙여 선언하면 컴파일러가 사용상의 에러를 잡아내는 데 도움을 준다.- 컴파일러 쪽에서 보면 비트수준 상수성을 지켜야 하지만, 우리는 개념적인(논리적인) 상수성을 사용해서 프로그래밍 해야한다.
- 상수 멤버 및 비상수 멤버 함수가 기능적으로 서로 똑같게 구현되어 있을 경우에, 코드 중복을 피하고 싶다면 비상수 버전이 상수 버전을 호출하게 하라.
- const
를 붙여 선언하면 컴파일러가 사용상의 에러를 잡아내는 데 도움을 준다
const
를 사용할 수 있는 곳에는 적극 활용하자.- 의도치 않은 오류를 잡아내는 데 많은 도움을 준다.
class Rational { ... }; const Rational operator*(const Rational& lhs, const Rational& rhs); Rational a, b, c; (a * b) = c // 반환형에 const를 붙여주지 않았다면 어처구니 없는 오류 발생
- 컴파일러 쪽에서 보면 비트수준 상수성을 지켜야 하지만, 우리는 개념적인(논리적인) 상수성을 사용해서 프로그래밍 해야한다
- 비트수준 상수성(물리적 상수성) : 어떤 멤버 함수가 그 객체의 어떤 데이터 멤버도 건드리지 않아야 상수 멤버 함수임을 인정하는 특성
- 논리적 상수성 : 상수 멤버 함수라고 객체의 한 비트도 수정할 수 없는 것이 아니라, 일부 몇 비트는 바뀔 수 있되, 그것을 사용자측에서 알아채지 못하게만 하면 된다는 특성
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]); } };