1. Accustoming Yourself to C++

  1. View C++ as a federation of languages.

오늘날의 C++는 멀티패러다임 언어이다. 다음 4가지 언어의 결합이라고 볼 수 있다: C, 객체지향 C++, 템플릿 C++, STL.

  • 효과적인 C++ 프로그래밍을 위한 룰은 어떤 C++의 부분을 쓰느냐에 따라 달라진다.

2. Prefer consts, enums, and inlines to #defines.

매크로로 정의한 수는 전처리기에 의해 치환되기 때문에 디버깅하기 힘들다. constexpr을 사용하자. 또한 매크로 함수를 쓰지 말고 inline 함수를 쓰자.

  • 간단한 상수에 대해서는 constexpr을 #define에 비해 선호하자.
  • 함수형 매크로에 대해서는 #define보다 inline을 쓰자.

3. Use const whenever possible.

오브젝트가 수정될 필요가 없는 경우라면 const를 선호하라. const 멤버 함수 내에서 수정될 수 있는 멤버 변수들은 (예를 들어 포인터 멤버 변수가 가리키는 객체의 특성 등) mutable로 처리한다. const, non-const 버전의 함수가 2개 있는 경우 const_cast와 static_cast를 이용해 처리해서 중복코드를 방지하는 것도 방법이다. 이 때에는 non-const 버전에서 const 버전을 불러야지, const 버전에서 non-const 버전을 부르면 안 된다.

  • const 선언은 컴파일러가 에러를 찾을 수 있게 도와준다.
  • 컴파일러는 bitwise constness를 생각하지만, 프로그래밍할 때는 논리적 constness를 염두에 두라.
  • const, non-const 버전의 함수가 2개 있는 경우 non-const 버전에서 const 버전을 불러서 중복코드를 막을 수 있다.

4. Make sure that objects are initialized before they’re used.

항상 오브젝트를 사용 전 초기화하라. 사용자 정의 타입에서는 생성자에서 초기화하는 것이 좋다. 이 때 생성자 몸체에 들어가기 전에 초기화해야 2번 초기화가 안 된다. const 멤버나 참조자 멤버는 반드시 초기화되어야 한다. 멤버 초기화 리스트의 순서는 클래스 내 멤버의 선언 순서를 따르라. 서로 다른 번역 단위에 정의된 비-지역 static 오브젝트의 초기화 순서는 정의되어 있지 않다. 그래서 비-지역 static 오브젝트가 초기화할 때 다른 번역 단위에 정의된 비-지역 static 오브젝트를 사용해서는 안 된다. 해결책은 비-지역 static 오브젝트를 static 멤버 함수 안에 넣어 그의 리턴값으로 사용하는 것이다.

  • 빌트인 타입에 대해서는 직접 초기화하라.
  • 생성자에서는 멤버 초기화 리스트를 사용하고, 그 순서는 클래스 내 멤버의 선언 순서와 맞추라.
  • 비-지역 static 오브젝트는 static 멤버 함수 안의 지역 멤버로 넣어서 초기화 순서 의존 문제를 피하라.