카테고리 없음

[Effective C++] Item4_객체를 사용하기 전에 반드시 그 객체를 초기화하자

해달 2018. 1. 25. 22:42

Item4_객체를 사용하기 전에 반드시 그 객체를 초기화하자

챕터 핵심 내용

  • 기본제공 타입의 객체는 직접 손으로 초기화 하자. 경우에 따라 저절로 되기도 하고 안되기도 하기 때문이다.
  • 생성자에서는, 멤버 초기화 리스트를 사용하자. 그리고 초기화 리스트에 멤버를 나열할 때는 클래스에 각 데이터 멤버가 선언된 순서와 똑같이 나열하자.
  • 여러 번역 단위에 있는 비지역 정적 객체들의 초기화 순서 문제는 피해서 설계하자. 비지역 정적 객체를 지역 정적 객체로 바꾸면 된다.

- 기본제공 타입의 객체는 직접 손으로 초기화 하자. 경우에 따라 저절로 되기도 하고 안되기도 하기 때문이다

  • 초기화되지 않은 값을 읽으면 미정의 동작이 일어난다.
  • 모든 객체를 사용하기 전에 항상 초기화하자.

- 생성자에서는, 멤버 초기화 리스트를 사용하자. 그리고 초기화 리스트에 멤버를 나열할 때는 클래스에 각 데이터 멤버가 선언된 순서와 똑같이 나열하자

  • 생성자에서는 객체의 모든 것을 초기화하자.
  • 대입(assignment)과 초기화(initialization)을 혼돈하면 안된다.
  • C++ 규칙에는 어떤 객체이든 그 객체의 데이터 멤버는 생성자의 본문이 실행되기 전에 초기화되어야 한다고 명시되어 있다.
  • 멤버 초기화 리스트를 쓰는 습관을 들이면 혹시나 어떤 멤버가 초기화 되지 않았다는 부담을 질 필요가 없다.
  • 멤버가 선언된 순서대로 리스트에 적어주자. 클래스 데이터 멤버는 그들이 선언된 순서대로 초기화되기 때문이다.

- 여러 번역 단위에 있는 비지역 정적 객체들의 초기화 순서 문제는 피해서 설계하자. 비지역 정적 객체를 지역 정적 객체로 바꾸면 된다

  • 정적 객체(static object) : 자신이 생성된 시점부터 프로그램이 끝날 때까지 살아 있는 객체
  1. 전역 객체
  2. 네임스페이스 유효범위에서 정의된 객체
  3. 클래스에서 static으로 선언된 객체
  4. 함수 안에서 static으로 선언된 객체(지역)
  5. 파일 유효범위에서 static으로 정의된 객체
  • 번역 단위(translation unit) : 컴파일을 통해 하나의 목적 파일을 만드는 바탕이 되는 소스 코드. 기본적으로는 소스 파일 하나. 포함되는 파일들까지 합쳐서 하나의 번역 단위가 됨.
  • 별개의 번역 단위에서 정의된 비지역 정적 객체들의 초기화 순서는 정해져 있지 않다.
  • 싱글톤 패턴을 이용하자.