코가손의 블로그

C++ 초기화 리스트 본문

C++/문법

C++ 초기화 리스트

Cogason 2021. 11. 11. 10:52

초기화 리스트를 이용하면 다음과 같은 상황에서 장점이 있다.

 

1. 상속 관계에서 원하는 부모의 생성자를 호출할 때 사용한다.

2. 정의와 동시에 초기화가 필요한 경우(참조 타입, cosnt)

 

이해를 돕기 위해 예시 코드를 한번 보도록 하자

class Player
{
public:
    Player() {}
    Player(int id) {}    // 자식 클래스에서 원하는 생성자를 호출하고 싶다면??
}

class Knight : public Player
{
public:
    Knight() 
    /*
    선처리 영역
    */
    {
        Player(1);
    }
    
private:
    int _hp;    // 초기화 안하면, 쓰레기값 들어감
}

위 코드는 초기화 리스트를 사용하지 않았다.

Knight클래스 생성자에서 Player(int id)생성자를 호출하고 싶다면 초기화 리스트를 이용하는게 효율적이다.

 

Knight( ) 에서 Player(1)을 호출하면

Player( ) > ~Player( ) > Player(1) 을 호출한다.

 

_hp와 같은 일반 변수는 별 차이가 없지만

멤버 변수가 클래스 타입인 경우 이와 같은 비효율적인 상황이 발생한다.

 

초기화 리스트 사용

class Knight : public Player
{
public:
    Knight() : Player(1), _hpRef(_hp), _hpConst(100)
    /*
    선처리 영역
    */
    {
        // 이 영역에서 _hpRef, _hpConst 초기화 불가능
    }
public:
    int _hp;
    
    int& _hpRef;
    const int _hpConst;
}

Player(1)

선처리 영역에 기본 생성자가 호출되기 때문에 원하는 생성자를 초기화 리스트를 통해 호출하면 해당하는 클래스의 생성자를 2번 호출하지 않도록 할 수 있고, 특정 상황에 따라 부모 클래스의 생성자 중 원하는 생성자로 호출 가능하다.

 

또한 참조 값이나 const변수는 정의와 동시에 초기화를 해야하기 때문에 초기화 리스트를 통해 초기화 해줄 수 있다.

 

'C++ > 문법' 카테고리의 다른 글

C++ 동적 할당  (0) 2021.11.11
C++ 연산자 오버로딩  (0) 2021.11.11
C++ 객체 생성  (0) 2021.11.11
C++ 정적 바인딩 vs 동적 바인딩  (0) 2021.11.11
C++ 깊은 복사 vs 얕은 복사  (0) 2021.11.11
Comments