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