-
새로 정의한 타입의 객체 생성 및 소멸은 어떻게 이루어져야 하는가?
이 부분에 따라 클래스의 생성자 및 소멸자의 설계가 바뀝니다. 그뿐 아니라 메모리 할당 연산자 함수를 오버로딩 하는 경우에는 이들 연산자 함수의 설계에도 영향을 미칩니다.
-
객체 초기화는 객체 대입과 어떻게 달라야 하는가?
생성자와 대입 연산자의 동작 및 둘 사이의 차이점을 결정짓는 요소입니다.
-
새로운 타입으로 만든 객체가 값에 의해 전달되는 경우에 어떤 의미를 줄 것인가?
여기서 잊으면 안되는 중요한 사실은 '값에 의한 전달'을 구현하는 쪽은 바로 복사생성자라는 것입니다.
-
새로운 타입이 가질 수 있는 적법한 값에 대한 제약은 무엇으로 잡을 것인가?
전부는 아니지만, 클래스의 데이터 멤버의 몇 가지 조합 값만은 반드시 유효해야 합니다. 이런 조합을 가리켜 클래스의 불변속성(invariant)이라고 하며, 클래스 차원에서 지켜주어야 하는 부분입니다. 이 불변속성에 따라 클래스 멤버 함수 안에서 해 주어야 할 에러 점검 루틴이 좌우되는데, 특히 생성자, 대입 연산자, 각종 "쓰기(setter)" 함수는 불변속성에 많이 좌우됩니다. 그뿐 아니라 불변속성은 함수가 발생시키는 예외에도 영향을 미치며, 예외 지정을 쓴다면 그 부분에도 영향을 줍니다.
-
기존의 클래스 상속 계통망(inheritance graph)에 맞출 것인가?
이미 갖고 있는 클래스로부터 상속을 시킨다고 하면, 클래스의 설계는 이들 클래스에 의해 제약을 받게 됩니다. 특히 멤버 함수의 가상성 여부가 가장 큰 요인입니다.(항목 34 및 36 참조) 만약 직접 만든 클래스를 다른 클래스들이 상속할 수 있게 만들자고 결정했다면, 이에 따라 멤버 함수의 가상 함수 여부가 결정됩니다.(특히 소멸자)
-
어떤 종류의 타입 변환을 허용할 것인가?
암시적 타입 변환과 명시적 타입 변환중 허용할 타입 변환을 정합니다.
-
어떤 연산자와 함수를 두어야 의미가 있을까?
클래스 안에 선언할 멤버 함수가 여기서 결정됩니다. 멤버 함수로 적당한 함수와 그렇지 않은 함수가 있을 것입니다.(항목 23, 24, 46 참조)
-
표준 함수들 중 어떤 것을 허용하지 말 것인가?
private로 선언해야 하는 함수가 여기에 해당됩니다.(항목 6 참조)
-
새로운 타입의 멤버에 대한 접근권한을 어느 쪽에 줄 것인가?
어떤 클래스 멤버를 public, protected, private 영역에 둘 것인가를 결정하는데 도움을 주게 될 질문입니다. 또한 프렌드로 만들어야 할 클래스 및 함수를 결정하는것은 물론이고 한 클래스를 다른 클래스에 중첩시켜도 되는가에 대한 결정을 내리는 데도 이 질문이 도움이 될 것입니다.
-
'선언되지 않은 인터페이스'로 무엇을 둘 것인가?
만든 타입이 제공할 보장이 어떤 종류일까에 대한 질문으로서, 보장할 수 있는 부분은 수행 성능 및 예외 안전성(항목 29 참조) 그리고 자원 사용(잠금 및 동적 메모리 등) 입니다. 이들에 대해 여러분이 보장하겠다고 결정한 결과는 클래스 구현에 있어서 제약으로 작용하게 됩니다.
-
새로 만드는 타입이 얼마나 일반적인가?
정의하는 클래스가 타입 하나가 아니라 동일 계열의 타입군(family of types) 전체일지도 모릅니다. 만일 그렇다면 새로운 클래스가 아니라 새로운 클래스 템플릿을 정의해야 할 것입니다.
-
정말로 꼭 필요한 타입인가?
기존의 클래스에 대해 기능 몇 개가 아쉬워서 파생 클래스를 새로 만들기 보다는, 차라리 간단하게 비멤버 함수라든지 템플릿을 몇 개 더 정의하는 편이 낫습니다.