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