본문 바로가기
Book & Lecture/Effective C++

Effective C++ 항목4 : 객체를 사용하기 전에 반드시 그 객체를 초기화하자

by studio ODOC 2023. 1. 25.
반응형

Effective C++ 항목4

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

 

클래스의 멤버 변수를 초기화할 때
  • 생성자 등 함수의 구현 부에서 값을 대입하면?
    • => 기본 생성자 호출 후, 복사 대입 생성자가 호출되어 런타임 시간이 더 걸린다. (비효율적!)
  • 멤버 초기화 리스트(이니셜라이저)를 사용하면?
    • => 초기화와 동시에 값 복사된다.
    • => 복사 생성자만 호출되므로 보다 효율적!
  • 상수와 참조자로 되어있는 멤버 변수는 반드시 초기화 되어야함
    • 갖가지 경우를 모두 기억하기 보다는 멤버 초기화 리스트를 사용하는 것이 안전!
    • 멤버 초기화 리스트 순서는 멤버 변수 선언 순서와 동일하게 가야 유지보수 편리
  • 객체를 구성하는 데이터 초기화 순서는?
    • 기본 클래스는 파생 클래스보다 먼저 초기화
    • 클래스 데이터 멤버는 그들이 선언된 순서대로 초기화
    • 비지역 정적 객체(non-local static object, 이하 NLSO)의 초기화 순서는 개별 번역 단위에서 정해진다. (초기화 순서가 정해져 있지 않다!)
      • 정적 객체란?
        • 전역 객체 / 네임스페이스 유효범위에서 정의된 객체 / 클래스 내에 static선언된 객체 / 함수 내 static선언된 객체 / 파일 유효범위에서 static 정의된 객체
      • 문제 발생 : 서로 다른 소스 파일의 NLSO끼리 사용된다면?
        • 사용되는 NLSO가 초기화 되지 않았을 수도 있다!
        • 해결책 => NLSO를 클래스 내에서 "정적 객체로 선언하고 참조자를 반환하는" 참조자 반환 함수를 만들면 된다. (=싱글턴 패턴의 구현양식)
          • 추가 문제 : 참조자 반환 함수는 내부적으로 정적 객체를 쓰기 때문에, 다중스레드 상황에서 문제 야기 가능
            • 해결책 => 다중스레드 돌입 전에 참조자 반환 함수를 호출하여 race condition 방지
반응형