5. Construction, Destruction, and Copying

생성, 소멸, 복사에 대해 알아보자.

47. Define and initialize member variables in the same order.

컴파일러와 합의하라. 멤버 변수는 항상 클래스 정의부에서 선언된 순서로 초기화된다. 생성자 초기화 리스트에서 쓰여진 순서는 무시된다. 생성자 코드가 혼란스럽게 다른 순서를 특정하지 않도록 하라.

48. Prefer initialization to assignment in constructors.

한 번 대입하면 어디에서나 써라. 생성자에서는 대입 대신 초기화를 사용해 같은 양의 타이핑으로 멤버 변수가 불필요한 런타임 작업을 하지 않도록 하라.

49. Avoid calling virtual functions in constructors and destructors.

가상 함수는 가상적으로만 가상적으로 동작한다. 생성자와 소멸자 안에서는 그렇지 않다. 더 나쁜 것은 생성자나 소멸자에서 구현되지 않은 순수 가상 함수에 대한 비간접적 호출은 정의되지 않은 행동이라는 것이다. 설계가 기반 클래스 생성자나 소멸자의 파생 클래스에 대한 가상 부착을 필요로 한다면 후생성자와 같은 다른 기법들이 필요하다.

50. Make base class destructors public and virtual, or protected and nonvirtual.

delete할 것이냐 말 것이냐 그것이 문제이다. 기반 클래스의 포인터를 통한 삭제가 허용되면 기반 클래스의 소멸자는 public virtual이어야 한다. 아니면 protected nonvirtual이어야 한다.

51. Destructors, deallocation, and swap never fail.

그들이 시도하는 모든 것은 성공해야 한다. 소멸자나 자원 해제 함수 (ex. operator delete), 교환 함수가 에러를 보고하게 하지 마라. 소멸자가 예외를 던지는 타입들은 C++ 표준 라이브러리에서 완전히 금지되어 있다.

52. Copy and destroy consistently.

무언가를 만들면 청소도 해라. 복사 생성자, 복사 대입 연산자, 이동 생성자, 이동 대입 연산자, 소멸자 중 하나를 만들면 다른 것들도 만들어야 한다.

53. Explicitly enable or disable copying.

의식적으로 복사해라. 컴파일러에 의해 생성된 복사 생성자/대입 연산자, 이동 생성자/대입 연산자를 의식적으로 선택하거나, 직접 쓰거나, 허용되지 않은 경우에는 명시적으로 비활성화하라.

54. Avoid slicing. Consider clone instead of copying in base classes.

잘린 빵은 좋다. 잘린 오브젝트는 아니다. 오브젝트 슬라이싱은 자동적이고, 보이지 않고, 환상적인 다형성 설계를 주정뱅이로 만들 수 있다. 기반 클래스에서는 복사 생성자와 복사 대입 연산자를 비활성화하고 클라이언트가 다형 복제를 필요로 한다면 가상 복제 멤버 함수를 제공하라.

55. Prefer the canonical form of assignment.

당신의 과제이다. operator=를 구현할 때에는 자연스러운 형태를 선호하라. 비virtual로 하고 특정 시그니쳐를 제공하라.

56. Whenever it makes sense, provide a no-fail swap (and provide it correctly)

swap은 경량이며 많이 쓰인다. swap 함수를 효율적이고 실패하지 않게 오브젝트의 내부를 다른 오브젝트와 교환하도록 제공하라. 그런 함수는 여러 관용구를 구현하는 데 있어 편리할 수 있다. 예를 들면 오브젝트를 유연하게 이동시키는 것이나 대입을 강하게 에러-안전한 호출 코드를 보장하도록 하는 것.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중