코가손의 블로그
C++ 초기화 리스트 본문
초기화 리스트를 이용하면 다음과 같은 상황에서 장점이 있다.
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