Class Creation

클래스 불변식

객체는 메모리 묶음이 아니라 생성 순간부터 지켜야 할 조건을 가진 값이다. 멤버 선언, 초기화 리스트, 생성 위치가 그 조건을 만든다.

01

필수 값을 강제한다

객체가 의미 있으려면 꼭 필요한 값은 기본 생성 뒤 setter로 미루지 않는다.

02

초기화 순서를 맞춘다

멤버 선언 순서와 의존 관계가 어긋나면 생성자 리스트 순서와 달리 작동한다.

03

복사 가능성 결정

객체가 컨테이너에 들어가거나 반환될 때 복사와 이동 정책이 맞는지 본다.

invariant
항상 참이어야 하는 조건 생성자 이후 public 함수 전후로 유지된다.
불완전 객체를 만들지 않는다.
initializer
멤버 직접 생성 대입보다 먼저 멤버가 올바른 값으로 만들어진다.
const와 reference 멤버에 필수다.
explicit
암시 변환 차단 한 인자 생성자가 오버로드 후보로 끼어드는 일을 막는다.
도메인 타입의 암시 변환을 막는다.
factory
복잡한 생성 분리 검증과 변환이 길면 정적 생성 함수로 의도를 드러낸다.
생성자는 유효 상태만 남긴다.

기본 생성 · 선언 순서 · 변환 점검

기본 생성 값 없이 만든 객체가 실제로 사용할 수 있는 상태인가.
선언 순서 멤버 초기화가 다른 멤버의 선언 순서에 의존하지 않는가.
변환 생성자가 실수로 암시 변환 통로가 되지 않는가.

필수 값 생성

class Port {
public:
    explicit Port(int value) : value_(value) {
        if (value < 0 || value > 65535) throw std::out_of_range("port");
    }
private:
    int value_;
};