0. 초기화의 필요성
class Knight
{
public:
Knight()
{
}
public:
int _hp;
};
int main()
{
Knight k;
cout << k._hp << endl;
return 0;
}
멤버 변수를 초기화 시키지 않으면 _hp는 무작위 값을 가질 수 있다(컴파일러마다 다를 수 있음).
이것이 경우에 따라 오류를 발생시킬 수 있다.
1. 멤버 변수 초기화
(1) 생성자 안에서 초기화
class Knight
{
public:
Knight()
{
_hp = 200;
}
//~~~~
(2) 초기화 리스트
class Player
{
public:
Player() {}
Player(int id) {}
};
class Knight : public Player
{
public:
Knight() : Player(1), _hp(100)
{
_hp = 200;
}
public:
int _hp;
};
생성자에서 멤버 변수를 선언하는 동시에 초기화함.
여러 멤버 변수를 한번에 초기화할 수 있음
(3) C++11 이후의 문법
public:
int _hp = 200;
2. 상속 관계 vs 포함 관계
Player - Knight 는 상속 관계(연관성이 존재)
Kinght - Inventory 는 포함 관계(연관성이 없음, 상속받지 않음)
포함 관계에서는 knight 클래스의 전처리 영역에서 Inventory의 기본 생성자가 호출됨
-> 이후에 함수 내에서 초기화를 해버리면
=> 기본 생성자가 호출됨 - 소멸 생성자가 호출됨 - 초기화 한 것의 생성자가 호출됨 - 소멸 생성자가 호출됨의 낭비가 발생
즉 초기화 리스트를 이용하여 먼저 초기화를 해줘야 함.
3. 참조 vs 포인터
생성자 내부에서 참조를 정의할 수 없다. 또한 const 도 정의할 수 없다.
즉 함수 내에서가 아닌 선처리 영역에서 초기화를 할 수 있도록 초기화 리스트를 이용하여야 한다.
'기초 C++ 스터디 > 객체지향' 카테고리의 다른 글
5-7. 객체지향 정리 (0) | 2023.05.30 |
---|---|
5-6. 연산자 오버로딩 (0) | 2023.05.30 |
5-4. 다형성 (0) | 2023.05.26 |
5-3. 은닉성 (0) | 2023.05.26 |
5-2. 상속성 (0) | 2023.05.26 |