C++에서 초기화 리스트를 사용하는 이유가 단순히 가독성 때문인가라고 생각했었는데, 그게 아니였다.
초기화 리스트는 선처리 영역에서 실행된다. 이 말의 의미에 대해 알아보자.
Child 클래스는 Parent 클래스를 상속받는 자식 클래스라고 하자.
그러면 Child 클래스는 본인의 생성자를 호출하기 전에 Parent 클래스의 생성자를 호출하는데 그게 어디일까?
Child()
//<--바로 여기
{
}
어셈블리 단계까지 뜯어보면 생성자의 블록이 시작되기 전 영역에서 Parent 클래스의 생성자를 호출한다
이를 선처리 영역이라고 하자. 초기화 리스트도 바로 이 선처리 영역에서 실행된다.
이 선처리 영역에서는 부모 클래스의 생성자 호출뿐만 아니라 Child 클래스 멤버 객체의 생성자가 호출되고 변수를 선언한다. 그래서 멤버 객체(포함 객체)의 생성자를 결정할 수 있다.
Player() : Inventory(20)
//선처리 영역에서 Inventory를 생성할 때 Inventory(int)생성자 호출
{
//inventory = Inventory(); (x) 선처리 영역에서 이미 호출하므로 생성자를 두번 호출하게 된다.
}
private:
Inventory inventory;
또한 선처리 영역에서 변수 또한 선언하므로 참조형 변수나 상수를 초기화 할 수 있다.
Human() : Hp(100), HpRef(Hp), HpConst(100) // (o)
{
Hp = 100;
//HpRef = Hp; (x)
//HpConst = 100; (x)
}
private:
int Hp;
int& HpRef;
const int HpConst;
참조형 변수는 선언될 때 무언가를 가리켜야 하는데, 선처리 영역에서 변수가 선언되므로 초기화 리스트를 사용하지 않는다면 이미 선언되고나서 생성자에서 가리킬 때는 이미 늦었다. 상수도 마찬가지이다.
'C++' 카테고리의 다른 글
| [C++] 값 타입 변환 vs 참조 타입 변환 (0) | 2022.06.22 |
|---|---|
| [C++] new vs malloc (0) | 2022.06.22 |
| [C++] 포인터 vs 배열 (0) | 2022.06.21 |
| [C++] 포인터 vs 참조(레퍼런스) (0) | 2022.06.20 |
| [C++] 정수형, 불리언, 부동소수점 (0) | 2022.06.19 |