위임 생성자 (Delegating Constructor)
위임 생성자를 하나의 클래스 내에서 비슷한 기능의 생성자가 필요한 경우 사용할 수 있습니다.
예를 들어, 범용 좌표 클래스를 디자인 한다고 합시다. 1차원 좌표 생성자, 2차원 좌표 생성자, 3차원 좌표 생성자 등이 필요하지만, 3차원 좌표 생성자는 2차원 좌표 생성자의 기능을 포함하고 2차원은 1차원의 기능을 포함합니다.
#include <iostream>
class Coordinate
{
public:
int w, x, y, z;
Coordinate(int w)
{
printf("Call 1D\n");
this->w = w;
}
Coordinate(int w, int x) : Coordinate(w)
{
printf("Call 2D\n");
this->x = x;
}
Coordinate(int w, int x, int y) : Coordinate(w,x)
{
printf("Call 3D\n");
this->y = y;
}
Coordinate(int w, int x, int y, int z) : Coordinate(w, x, y)
{
printf("Call 4D\n");
this->z = z;
}
};
int main(int argc, char** argv)
{
Coordinate c(1, 2, 3, 4);
}
Call 1D
Call 2D
Call 3D
Call 4D
각 멤버 변수를 초기화 할 때 처럼, 생성자 뒤에 :을 붙이고 다른 생성자를 호출할 수 있습니다.
인스턴스 c를 생성할때 최초로 인수 4개인 생성자가 호출되면서, 인수 3개의 생성자를 호출합니다.
이후 연쇄 호출되어 인수 1개의 생성자까지 호출된 후 인수 1개의 생성자부터 역순으로 처리됩니다.
위임 생성자는 다른 멤버 변수를 초기화 할 수 없습니다. 따라서 아래와 같은 코드는 허용되지 않습니다.
Coordinate(int w, int x, int y) : Coordinate(w,x) , y(y)