오븐 노트

[C++] 초기화 리스트 본문

Develop/C++

[C++] 초기화 리스트

오 븐 2022. 10. 5. 15:13
#include <iostream>
using namespace std;

// 멤버 변수 초기화 ? 다양한 문법이 존재

// 초기화를 해야하는 이유
// - 버그 예방에 중요
// - 포인터 등 주소값이 연루되어 있을 경우

// 초기화 방법
// - 생성자 내에서
// - 초기화 리스트
// - C++11 문법 ex) int _hp = 100; // 모던 C++ 11 이전에서는 지원하지 않던 문법. 팀에 따라 사용하지 않을 수 있다.

// 초기화 리스트
// - 일단 상속 관계에서 원하는 부모 생성자 호출할 때 필요.
// - 생성자 내에서 초기화 vs 초기화 리스트
// -- 일반 변수는 별 차이 없음
// -- 멤버 타입이 클래스인 경우 차이가 생김
// -- 정의함과 동시에 초기화가 필요한 경우 (참조 타입, const 타입)

class Inventory
{
public:
    Inventory() { cout << "Inventory()" << endl; }
    Inventory(int size) { cout << "Inventory(int size)" << endl; _size = size; }

    ~Inventory() { cout << "~Inventory()" << endl; }

public:
    int _size = 10;
}

class Player
{
public:
    Player() { }
    Player(int id) { }
}

// 고려해야 할 구조
// is-A (Knight is-A Player?) 기사는 플레이어인가? ) OK -> 상속관계
// has-A (Knight Has-A Inventory?) 기사는 인벤토리를 포함하고(가지고) 있다. ) OK -> 포함관계

class Knight
{
public:
    Knight() : Player(1), _hp(100), _inventory(20), _hpRef(_hp), _hpConst(100) /*초기화 리스트*/
    /*
        선처리 영역
        컴파일러가 자동으로 추가된 코드를 실행하는 구간.
        우리가 명시적으로 지시를 내릴수도 있는데, 이것이 초기화 리스트이다.

        C++11 문법으로는 선언과 동시에 초기화 할 수 있지만, 그 이전 버전을 사용하는 경우를 위한 초기화 리스트
    */
    {
        _hp = 100; // 일반 변수 초기화
        // _inventory = Inventory(20); // 해당 주석을 실행 시 선처리 영역에서 이미 Inventory()의 생성자가 호출되었기에 필요 없는 생성, 소멸이 한번 더 일어나게 된다. 따라서 초기화 리스트에 지시하는것이 효율적이다.

        // _hpRef = _hp; // 누군가를 꼭 가리키고 있어야함 ) 이미 선처리를 지나 생성되었기에 다른 값으로 수정 할 수 없다.
        // _hpConst = 100; // 절대로 바뀔 수 없는 값 ) 이미 선처리를 지나 생성되었기에 다른 값으로 수정 할 수 없다.
    }

public:
    int _hp; // 초기화를 하지 않았으므로 쓰레기 값이 존재
    Inventory _inventory; // 라이프 사이클이 Knight에 종속됨

    int* _hpPtr; // 포인터 변수는 기본값으로 초기화 되어도 큰 상관이 없다.
    int& _hpRef; // 참조 변수는 어떠한 것에 대해 부가적 이름을 지어주는 개념이기에 꼭 무언가를 가리키고 있어야한다.
    const int _hpConst;
};

int main()
{
    Knight k;

    cout << k._hp << endl;

    if (k._hp)
    {
        cout << "Knight is Dead" << endl;
    }

    return 0;
}

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
 
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.

 

모든 글은 제가 공부하기 위해 작성합니다.

'Develop > C++' 카테고리의 다른 글

[C++] 객체지향 마무리  (0) 2022.10.06
[C++] 연산자 오버로딩 #1 ~ 2  (0) 2022.10.05
[C++] 다형성 #1 ~ 2  (0) 2022.09.28
[C++] 은닉성  (0) 2022.09.21
[C++] 상속성  (0) 2022.09.20