위임 생성자(delegating constructor), 생성자가 다른 생성자 호출
한 클래스의 생성자들에는 대개 객체를 초기화하는 비슷한 코드가 중복됩니다. 아래 코드의 경우에도 다음과 같이 2개의 생성자에 코드가 중복되어 있습니다.
Circle::Circle() {
radius = 1;
cout << "반지름 " << radius << " 원 생성" << endl;
}
Circle::Circle(int r) {
radius = r;
cout << "반지름 " << radius << " 원 생성" << endl;
}
C+11부터는 중복된 초기화 코드를 하나의 생성자로 몰고, 다른 생성자에서 이 생성자를 호출할 수 있게 한다. 이 기능을 아용하면 앞의 코드는 다음과 같이 간소화됩니다.
Circle::Circle() : Circle(1) { } // Circle(int r)의 생성자 호출
Circle::Circle(int r) {
radius = r;
cout << "반지름 " << radius << " 원 생성" << endl;
}
Circle() 생성자가 호출되면 Circle() 생성자는 자신의 코드를 실행하기 전에 Circle(int r) 생성자를 호출하여, r에 1을 넘겨주어 radius를 1로 초기화하고 반지름과 원 생성을 대신 출력하게 합니다.
Circle coin;
coin 객체가 생성될 때 생성자 Circle()이 호출되고, Circle()은 Circle(1)을 출력하여 coin 객체의 radius는 1이 되고 화면에는 메시지가 출력됩니다.
여기서, 객체의 초기화 작업이 코딩된 Circle(int r)를 타겟 생성자라고 부르고, Circle() 생성자는 객체의 초기화를 다른 생성자에 위임 생성자(delegating constructor)라고 부릅니다. 타켓 생성자에 객체 초기화를 전담시킴으로써 객체의 생성 과정이 명로(clear)해지고 단순(simple)해집니다. 위임 생성자에서는 타겟 생성자를 호출한 뒤, 자신만의 코드를 추가하면 됩니다.
예제 3-4 생성자에서 다른 생성자 호출 연습(위임 생성자 만들기 연습)
#include <iostream>
using namespace std;
class Circle {
public:
int radius;
Circle(); // 위임 생성자
Circle(int r); // 타겟 생성자
double getArea();
};
Circle::Circle() : Circle(1) { }
Circle::Circle(int r) {
radius = r;
cout << "반지름 " << radius << "원 생성" << endl;
}
double Circle::getArea() {
return 3.14 * radius * radius;
}
int main() {
Circle donut; // 매개 변수 없는 생성자 호출
double area = donut.getArea();
cout << "donut 면적은 " << area << endl;
Circle pizza(30); // 매개 변수 있는 생성자 호출
area = pizza.getArea();
cout << "pizza 면적은 " << area << endl;
}
실행 결과
반지름 1원 생성
donut 면적은 3.14
반지름 30원 생성
pizza 면적은 2826
'프로그래밍 언어 > C++' 카테고리의 다른 글
| 생성자는 꼭 있어야 하는가? (0) | 2026.06.12 |
|---|---|
| 생성자와 멤버 변수의 초기화 (0) | 2026.06.09 |
| 생성자란? (1) | 2026.06.03 |
| 객체 생성과 객체 활용 (0) | 2026.05.31 |
| C++ 클래스 만들기 (0) | 2026.05.28 |