C++ Chapter 8.4 : 생성자 멤버 초기화 목록

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 8. 객체 지향의 기초 : 생성자 멤버 초기화 목록

🔔 생성자 멤버 초기화 목록

생성자 내부 {} 중괄호 처리가 시작되기 전에 초기화를 먼저 완료되는 멤버 목록

class Something
{
private:
    int m_i;
    double m_d;
    char m_c;
    int m_arr[5];

public:
    Something()
        : m_i{ 10 }, m_d{ 3.14 }, m_c{ 'a' }, m_arr{ 1, 2, 3, 4, 5 }
    {
        //
    }
}

생성자 이름 바로 아래 : 에서, 즉 생성자 내부 바깥에서 각 멤버들을 초기화 할 수 있다. 뒤에 세미콜론이 붙지 않는 것에 주의할 것. m_arr{ 1, 2, 3, 4, 5 } 를 보면 알 수 있듯, 배열인 멤버의 원소들도 초기화가 가능하다. {}을 쓸 수도 있고 ()을 쓸 수도 있는데 {}을 쓰면 초기화시 더 엄격하여 자동 형변환 해주지 않는다.

class Something
{
private:
    int m_arr[5];

public:
    Something() : m_arr{} { }
}

여담으로 배열 멤버를 초기화 할 때 m_arr{} 혹은 m_arr() 로 해주면 배열의 모든 멤버가 0 (NULL)으로 초기화 된다.


🔔 다른 클래스를 멤버로 가질 때

class ABC
{
private:
    int m_abc;

public:
    ABC(const int & m_abc_in)
        : m_abc = m_abc_in
    { }
}

class Something
{
private:
    int m_i;
    double m_d;
    char m_c;
    int m_arr[5];
    ABC abc;   // ✨ 다른 클래스 타입의 객체를 멤버로 가질 때

public:
    Something()
        : m_i{ 10 }, m_d{ 3.14 }, m_c{ 'a' }, m_arr{ 1, 2, 3, 4, 5 }, abc{ m_i - 1 }//✨ABC의 생성자를 불러와 ABC abc{9}; 으로 넘어가게 된다.✨
    { }
}

Somathing 클래스가 현재 ABC 클래스 타입의 객체 abc 를 멤버로 가지고 있는 상태. 이를 생성자 초기화 목록에서 abc{m_i - 1} 로 초기화 하면 ABC 의 생성자가 호출되고 m_i - 1, 즉 9 값이 인수로 넘어가게 된다. ABC의 생성자가 호출됨에 따라 ABC의 멤버 변수 m_abc 값이 9로 대입된다.


🔔 초기화 우선 순위 (메모리 할당, 처리 순서)

class Something
{
private:   /* 1번 */
    int m_i - 100;
    double m_d = 12.34;
    char m_c = 'F';
    int m_arr[5] = { 100, 200, 300, 400, 500 };
    ABC abc{ 1024 };

public:
    Something()  /* 2번 */
        : m_i{ 10 }, m_d{ 3.14 }, m_c{ 'a' }, m_arr{ 1, 2, 3, 4, 5 }, abc{ m_i - 1}
    {    /* 3번 */
        m_i = 3;
        m_d = 3.0f;
        m_c += 1;
    }
}

우선순위는 1번 < 2번 < 3번 순서이다.

  • 1번은 실제 메모리에 할당하는 과정이 아닌 단지 클래스의 정의일 뿐이다.
  • 2번인 생성자 초기화 리스트에서 멤버 변수들이 초기화는 객체의 메모리 할당과 동시에 진행되는데 따라서 1번보다 우선시 된다.
    • 2번, 즉 생성자 초기화리스트 과정까진 메모리를 할당받기만 하는 과정이라 메모리 할당만 받고 쓰레기 값만 들어있다가 {} 중괄호가 시작되기 직전에 그제서야 값이 할당된다.
  • 3번은 객체의 메모리 할당이 완료된 후 실행된다. 2번, 1번에 의해 초기화된 것들을 덮어 씌운다.

  • 최종적으로
    • m_i = 3
    • m_d = 3.0
    • m_c = ‘b’
    • m_arr = { 1, 2, 3, 4, 5 }
    • abc{ 9 }

상속 받은 클래스의 경우 처리 순서

  1. 생성자의 인수를 받는 부분
  2. 생성자 초기화 리스트 부분
    • 메모리를 할당 받는다.
    • 부모 생성자를 호출한다. 👉 부모로부터 상속받은 멤버들을 초기화
  3. 자신의 생성자 {} 중괄호 부분 처리
    • 자신만의 멤버들을 초기화한다.


1️⃣ 메모리 할당 ( 생성자 초기화 리스트에 있는 자기 자신 멤버들은 쓰레기값만 들어있는 상태)

2️⃣ 부모 생성자 호출 (물려 받은 멤버는 할당 + 초기화까지 완료)

3️⃣ 초기화 (생성자 초기화 리스트에 있는 자기 자신 멤버들 초기화)

4️⃣ 자신의 생성자 내부 {}중괄호 부분 처리



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기


Cpp 카테고리 내 다른 글 보러가기

댓글 남기기