함수의 몸체 부분을 사용하지 않고 멤버 변수의 초기화를 지원하는 문법적 요소.
멤버 변수가 객체인 경우와 그렇지 않은 경우로 나뉜다.
멤버 변수가 객체인 경우
클래스 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과 동일하게 동작한다.
멤버 이니셜라이저를 사용하여 멤버 변수를 초기화하는 방법은 함수의 몸체에서 멤버 변수를 초기화하는 방법과 비교해 아래의 이점이 있다.
- 초기화의 대상을 명확히 인식할 수 있다.
- 이니셜라이저를 이용하면 선언과 동시에 초기화가 이뤄지는 형태로 바이너리 코드가 생성된다.
- 이니셜라이저를 이용한 초기화는 다음의 형태로 바이너리 코드를 구성한다.
num1(n1) //int num1 = n1; - 함수의 몸체에서 이뤄지는 초기화는 다음의 형태로 바이너리 코드를 구성한다.
num1 = n1; //int num1; num1=n1;
- 이니셜라이저를 이용한 초기화는 다음의 형태로 바이너리 코드를 구성한다.
- 2.의 이유로, 선언과 동시에 초기화가 이뤄져야 하는 형식의 멤버변수(const, 참조자)는 이니셜라이저로만 초기화시킬 수 있다.
참고자료