본문 바로가기

C++

[C++] 초기화 리스트는 선처리 영역에서 실행된다.

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