카테고리 없음

[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]);
    }
};