C++ 객체 생성

생성자 호출과 초기화 순서를 코드 실행 순서로 읽기

객체 생성은 메모리 확보 뒤 멤버가 선언 순서대로 초기화되고 생성자 본문이 실행되는 과정이다. 초기화 리스트와 대입을 구분하지 않으면 const, reference, 기본 생성자 없는 멤버에서 바로 막힌다.

01

저장 공간 확보

자동, 동적, 정적 저장 기간에 맞춰 객체 메모리가 준비된다.

아직 완성 전
02

기반/멤버 초기화

base class와 멤버가 선언 순서대로 초기화 리스트를 통해 만들어진다.

리스트 순서보다 선언 순서
03

본문 실행

생성자 본문에서는 이미 초기화된 멤버에 추가 검증과 대입을 수행한다.

초기화와 대입 차이
04

실패 처리

중간 예외가 나면 이미 완성된 멤버만 역순으로 파괴된다.

부분 생성 정리
default
인자가 없는 생성 멤버가 기본 생성 가능해야 자동 기본 생성자가 살아남는다.
삭제 여부 확인
explicit
암시 변환 차단 단일 인자 생성자는 의도치 않은 변환 후보가 될 수 있다.
API 방어
delegating
공통 초기화 위임 한 생성자가 다른 생성자를 호출해 중복 초기화 로직을 줄인다.
순환 위임 금지
aggregate
중괄호 기반 멤버 초기화 사용자 선언 생성자와 접근 제어가 aggregate 여부를 바꾼다.
표준 버전 차이

const/reference · 순서 경고 · 예외 점검

const/reference const와 reference 멤버는 생성자 본문 대입이 아니라 초기화 리스트가 필요하다.
순서 경고 초기화 리스트 작성 순서와 선언 순서가 다르면 의존성 버그가 난다.
예외 생성 중 던질 수 있는 함수가 있으면 자원은 RAII 멤버로 감싼다.

초기화 순서 메모

struct X {
  int a;
  int b;
  X() : b(2), a(b) {} // a is initialized before b
};