Channi Studies

[C++] 생성자 초기화 리스트 (Constructor Initialization List), 생성자 오버로딩 본문

C++/객체지향 프로그래밍 (OOP)

[C++] 생성자 초기화 리스트 (Constructor Initialization List), 생성자 오버로딩

Chan Lee 2023. 12. 28. 17:11

C++에서 객체를 생성할 때, 

대입 연산자를 사용하지 않고 리스트의 형식으로 초기화 하는 방법이 존재합니다.

이를 우리는 생성자 초기화 리스트 라고 부릅니다

 

예시를 보여드리겠습니다.

class Player {
private:
  string name{};
  int health{};
  int xp{};

public:
  // Constructor
  Player(string name_val, int health_val, int xp_val);
};

Player::Player(string name_val, int health_val, int xp_val)
    : name{name_val}, health{health_val}, xp{xp_val} {}

 

하지만 입력하는 사람이 모든 값을 입력하지 않을 수 있기 때문에 우리는 오버로딩을 합니다.

함수의 오버로딩과 동일한 개념입니다.

 

Player();
Player(string name_val);
Player(string name_val, int health_val);
Player(string name_val, int health_val, int xp_val);


Player::Player() : name{"None"}, health{0}, xp{0} {}
Player::Player(string name_val) : name{name_val}, health{0}, xp{0} {}
Player::Player(string name_val, int health_val)
    : name{name_val}, health{health_val}, xp{0} {}
Player::Player(string name_val, int health_val, int xp_val)
    : name{name_val}, health{health_val}, xp{xp_val} {}

하지만 동일한 코드를 자꾸 반복해서 입력하게 되죠?

이를 해결한 방법은 다음과 같습니다.

가장 큰 범위의 생성자를 먼저 지정하고, 이에 대입하는 방법입니다.

 

Player(string name_val, int health_val, int xp_val);
Player();
Player(string name_val);
Player(string name_val, int health_val);


Player::Player(string name_val, int health_val, int xp_val)
    : name{name_val}, health{health_val}, xp{xp_val} {}
Player::Player() : Player("None", 0, 0) {}
Player::Player(string name_val) : Player(name_val, 0, 0) {}
Player::Player(string name_val, int health_val): Player(name_val, health_val, 0) {}