c++ 멤버 초기화 리스트(Member Initialize List)
콜론(:) 초기화
멤버 초기화 리스트(Member Initialize List)를 사용해서 생성자를 초기화하는 방법을 설명한다. 초기화 리스트는 멤버 이니셜라이저, 콜론(:) 초기화라고도 불린다.
특징
생성자 블록({…}) 내에서 변수를 초기화하는 경우, 멤버 변수에 대한 공간(메모리)를 만들고 그곳에 데이터를 대입시키면서 총 2번의 함수가 호출된다. 반면에, 생성자 블록 바깥에서 초기화 리스트를 사용해서 초기화하는 경우, 멤버 변수에 대한 공간(메모리)를 만들면서 동시에 데이터를 대입하기 때문에 총 1번의 함수가 호출된다는 특징이 있다.
사용 상황
초기화 리스트를 사용하는 때는 class 내에 reference 멤버 변수를 초기화할 때, 상수(=const, non static const) 멤버 변수를 초기화할 때, default 생성자가 없는데 생성자를 사용하려 할 때, base class(=parent class or super class) 멤버 변수를 초기화할 때, 생성자 input parameter 이름이 멤버 변수와 같을 때 사용하게 된다.
샘플 코드
아래 코드는 system_contract 라는 class에 멤버 변수 _var1, _var2, _var3를 만들었다. 그리고 생성에서 이 3가지 값을 초기화하는 값을 모두 받고 있다. “os.system.cpp”파일의 생성자(constructor)를 보면, _var1과 _var2는 초기화 리스트를 사용해서 초기화하였고, _var3는 일반적인 방법으로 사용해서 초기화하였다. 아래 샘플 코드를 보며 이해해본다.
코드 구성
- os.system.hpp : system_contract 클래스 인터페이스부
- os.system.cpp : system_contract 클래스 구현부
- main.cpp : 메인
os.system.hpp
#include <stdint.h>
#include <iostream>
namespace ossystem {
class system_contract {
private:
uint64_t _var1;
uint64_t _var2;
uint64_t _var3;
public:
//constructor
system_contract(uint64_t a, uint64_t b, uint64_t c);
//destructor
~system_contract();
void call();
};
}
os.system.cpp
#include "os.system.hpp"
namespace ossystem {
system_contract::system_contract(uint64_t a, uint64_t b, uint64_t c) : _var1(a), _var2(b)
{
_var3 = c;
}
system_contract::~system_contract()
{
}
void system_contract::call()
{
std::cout << _var1 << ", " << _var2 << ", " << _var3;
}
}
main.cpp
#include <iostream>
#include "os.system.hpp"
using namespace std;
using namespace ossystem;
int main()
{
cout << "Hello Joker" << endl;
system_contract c = system_contract(100, 101, 102);
c.call();
return 0;
}
샘플 코드 실행 결과
Hello Joker
100, 101, 102