CS/C++

멤버 초기화 리스트

졔졔311 2024. 12. 20. 09:04
728x90
반응형

c++ 관련 코드를 보던 중, 특이한 문법을 발견했다.

예를 들어, 다음과 같은 코드였다.

class Calc{
    int ref;
public:
    Calc() : ref(0) {
    	// 생성자 본문
    }
};

 

나는 평소에 생성자 본문에서 멤버 변수(여기서는 ref)를 초기화 시켰는데,

여기서는 아마도 멤버 변수의 초기화로 보이는 부분("ref(0)")이 생성자 옆에 들어간 것이다.

 

멤버 초기화 리스트

이런 문법을 "멤버 초기화 리스트(Member Initialization List)"라고 부른다.

클래스의 멤버 변수를 생성자 본문(body)에 들어가기 전에 초기화하는 방법이다.

멤버 초기화 리스트는 생성자가 실행되기 이전에 실행되므로, 생성자 본문이 실행되기 전에 멤버 변수를 초기화한다.

 

멤버 초기화 리스트의 사용 이유

다음과 같이 생성자 본문에서 초기화를 할 수 있는데,

Calc() {
    ref = 0;
}

이 경우에는 기본 생성자가 먼저 호출된 후 다시 값이 할당되는 형태이다.

멤버 초기화 리스트를 사용하면 변수 초기화가 한 번에 이루어지므로 효율적이다.

 

또한, 참조 변수(int&)나 상수(const int)는 초기화 시에만 값을 설정할 수 있어 멤버 초기화 리스트가 필수이다.

다음과 같이 사용할 수 있다.

class Calc{
    const int val;
    int& ref;
    
public:
    Calc(int v, int& r)
    : val(v), ref(r) {
        // 본문
    }
}

 

클래스 멤버가 다른 클래스의 객체라면, 이 경우에도 멤버 초기화 리스트를 사용할 수 있다.

아래와 같이, class A에는 멤버 변수 x를 초기화하는 생성자가 존재하고,

class B의 생성자에서는 A 객체를 초기화하는 과정이 포함되어 있다.

이때, A의 생성자를 호출하게 되는데, 그걸 멤버 초기화 리스트를 사용해 해줄 수 있다.

class A{
    int x;
public:
    A(int v) : x(v) {
    	// 생성자 본문
    }
};

class B{
    A a;
public:
    B(int v) : a(v) {	// A의 생성자를 호출하며 초기화
    }
};
728x90
반응형

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

[c++ 문법] friend  (0) 2024.06.11