member initializer list
콜론 뒤 목록은 “대입”이 아니라 객체가 처음 만들어지는 순서표다
초기화 리스트는 생성자 본문보다 먼저 실행된다. 단, 실제 멤버 생성
순서는 목록에 적은 순서가 아니라 클래스 안의 선언 순서가 기준이다.
먼저
기반 클래스와 멤버가 생성된다.
순서
멤버 선언 순서가 실제 순서를 정한다.
본문
이미 만들어진 멤버를 검증하거나 보완한다.
Student 객체가 완성되는 내부 순서
1
저장 공간
객체가 놓일 메모리가 준비된다.
2
기반 클래스
상속이 있다면 기반 클래스 부분이 먼저 만들어진다.
3
멤버 선언 순서
name
id
GPA
course
4
생성자 본문
초기화가 끝난 멤버를 검사하고 불변식을 닫는다.
storage
base
name
id
GPA/course
body
선언 순서가 기준
class Student {
std::string name;
int id;
const double GPA;
Course& course;
Student(std::string n, int i, double g, Course& c)
: name(n), id(i), GPA(g), course(c)
{ validate(); }
순서 함정
목록을
GPA(g), name(n), id(i)처럼 적어도 실제 생성은
name, id, GPA 순서로
진행된다. 경고와 오독을 줄이려면 목록도 선언 순서와 맞춘다.
본문 대입으로 대신할 수 없는 멤버가 있다
| 대상 | 초기화 리스트 | 생성자 본문 | 판단 |
|---|---|---|---|
| 일반 멤버 | 처음 값으로 바로 생성한다. | 먼저 기본 초기화된 뒤 값을 바꿀 수 있다. | 리스트가 보통 더 명확하고 효율적이다. |
const 멤버 |
생성 시점에 값이 확정된다. | 본문에서 새 값을 대입할 수 없다. | 초기화 리스트가 필수다. |
| 참조 멤버 | 처음부터 어떤 객체에 묶인다. | 나중에 다른 대상에 다시 묶을 수 없다. | 참조 대상의 수명까지 함께 확인한다. |