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) {}