EC++ 항목 03 - 낌새만 보이면 const를 들이대 보자


EC++ 항목 03 - 낌새만 보이면 const를 들이대 보자

이것만은 잊지말자 1

const를 붙여 선언하면 컴파일러가 사용상의 에러를 잡아내는데 도움을 준다.
const는 어떤 유효범위에 있는 객체에도 붙을 수 있으며, 함수 매개변수반환 타입에도 붙을 수 있으며, 멤버 함수에도 붙을 수 있다.

STL iterator

std::vector<int>>::const_iterator cIter = vec.begin();
*cIter = 10; // OK

함수 선언

함수 선언에서 const를 붙일 수 있는 위치

  • 함수 반환
  • 각 매개변수
  • 멤버 함수
  • 함수 전체

상수 멤버 함수

멤버 함수에 선언된 const의 의미는 멤버 함수가 상수 객체에 대해 호출될 수 있는 함수라는 뜻이다.
또한 멤버 함수에 붙은 const 는 함수 signature에 포함된다. 그러므로 const 존재 여부로 오버로딩이 가능하다.

const의 다른 기능을 알아 보자.

  1. const 여부는 객체를 변경 할 수 있는 함수가 무엇인지 사용자가 알 수 있게 해준다.
  2. const 키워드를 통해 상수 객체를 사용할 수 있다.
    비상수 객체는 상수 멤버 함수와 비상수 멤버 함수 모두 호출 가능하다.
    하지만, 상수 객체는 상수 멤버 함수만 호출 할 수 있다.
’’비상수 멤버 함수상수 멤버 함수
비상수 객체OO
상수 객체XO

이것만은 잊지말자 2

컴파일러 쪽에서 보면 비트수준 상수성을 지켜야 하지만, 우리들은 논리적인 상수성을 사용해야 한다.

비트수준 상수성의 문제는 const 가 제대로 동작하지 않아도 다음 코드처럼 비트수준 상수성 검사를 통과하기 쉽다는 점이다.

char& operator[]( std::size_t position) const;
const MyClass c;
...
c[0] = 'a';

따라서 논리적 상수성을 사용해야 한다.
일부 몇 비트 정도는 바꿀 수 있지만 사용자 측에서 알아채지 못하게만 하면 상수 멤버 자격이 있다.

멤버 함수는 const 키워드를 붙이되, 내부에서 바뀌어야 하는 변수들은 mutable 을 사용한다.


이것만은 잊지말자 3

상수 멤버 및 비상수 멤버 함수의 코드 중복비상수 버전이 상수 버전을 호출하도록 하자.

코드 중복을 피하는 방법이지만, 캐스팅 비용이 발생 할 수도 있다.

class TextBlock
{
    ...
    const char& operator[]( std::size_t position ) const;

    char& operator[]( std::size_t position )
    {
        return const_cast<char&>( 
            static_cast<const TextBlock&>(*this)[position]
        );
    }
};

상수 멤버 함수가 비상수 멤버를 호출하면 안되는 이유는 다음과 같다.
상수 멤버 함수는 해당 객체의 논리적인 상태를 바꾸지 않겠다고 컴파일러와 약속한 함수이기 때문이다.




© 2017. by devan

Powered by devan