함수의 몸체 부분을 사용하지 않고 멤버 변수의 초기화를 지원하는 문법적 요소.
멤버 변수가 객체인 경우와 그렇지 않은 경우로 나뉜다.

멤버 변수가 객체인 경우

클래스 A가 또 다른 클래스 B의 멤버 변수로 존재하는 경우가 있다고 가정하자. 멤버 이니셜라이저를 사용하여 B 객체를 생성할 때( 즉 B의 생성자를 호출할 때 ) 멤버 변수로서 존재하는 A 객체의 생성자를 동시에 호출할 수 있다.

아래와 같이 동작한다.

 
class Point
{
	private :
		int x;
		int y;
	public :
		Point(const int &xpos, const int &ypos);
}
 
Point::Point(const int &xpos, const int &ypos)
{
	x=xpos;
	y=ypos;
}
 
class Rectangle
{
	private :
		Point upLeft;
		Point lowRight;
	public :
		Rectangle(const int &x1, const int &y1, const int &x2, \
		const int &y2);
}
 
Rectangle::Rectangle(const int &x1, const int &y1, const int &x2, \
					 const int &y2):upLeft(x1, y1), lowRight(x2, y2)
{
	//empty;
}
 

위 예제에서 :upLeft(x1, y1), lowRight(x2, y2) 에 해당하는 부분이 멤버 이니셜라이저이다. 인자 x1, y1으로 upLeft의 생성자를 호출, 인자 x2, y2로 lowRight의 생성자를 호출하라는 의미를 가지고 있다.

멤버 변수가 객체가 아닌 경우

아래와 같이 동작한다.

 
class SoSimple
{
	private :
		int num1;
		int num2;
	public :
		SoSimple(int n1, int n2) : num1(n1), num2(n2)
		{
			//empty;
		}
}
 

위의 예제는 결과적으로 아래와 동일하게 동작한다.

 
class SoSimple
{
	private :
		int num1;
		int num2;
	public :
		SoSimple(int n1, int n2)
		{
			num1 = n1;
			num2 = n2;
		}
}
 

num1(n1)num1 = n1과 동일하게 동작한다.

멤버 이니셜라이저를 사용하여 멤버 변수를 초기화하는 방법은 함수의 몸체에서 멤버 변수를 초기화하는 방법과 비교해 아래의 이점이 있다.

  1. 초기화의 대상을 명확히 인식할 수 있다.
  2. 이니셜라이저를 이용하면 선언과 동시에 초기화가 이뤄지는 형태로 바이너리 코드가 생성된다.
    • 이니셜라이저를 이용한 초기화는 다음의 형태로 바이너리 코드를 구성한다.
      num1(n1) //int num1 = n1;
    • 함수의 몸체에서 이뤄지는 초기화는 다음의 형태로 바이너리 코드를 구성한다.
      num1 = n1; //int num1; num1=n1;
  3. 2.의 이유로, 선언과 동시에 초기화가 이뤄져야 하는 형식의 멤버변수(const, 참조자)는 이니셜라이저로만 초기화시킬 수 있다.

참고자료

윤성우의_열혈_cpp_프로그래밍