C++11 표준이 나오기 전, 서로 다른 매개변수를 가진 여러 생성자를 작성해야 할 경우, 각 생성자에서 초기화 코드를 중복해서 작성해야 했습니다. 클래스의 생성자 내에서 다른 생성자를 호출할 수 있는 방법이 없었기 때문입니다.
기존 초기화 논리를 다른 생성자에서 사용할 수 없다는 것은 코드의 중복과 초기화 논리 변경 시 오류를 초래했습니다. 하나의 생성자를 업데이트할 때 나머지를 잊어버리는 것이 쉬웠습니다.
C++11의 출현으로 "위임 생성자" 메커니즘이 등장하여 클래스의 한 생성자가 동일 클래스의 다른 생성자를 초기화 목록 구문을 통해 호출할 수 있게 되었습니다.
코드 예제:
class Widget { public: Widget() : Widget(0, "default") {} Widget(int n) : Widget(n, "user") {} Widget(int n, std::string name) : size(n), label(name) {} private: int size; std::string label; };
이제 모든 공통 로직이 하나의 "주" 생성자에 집중되고, 나머지는 그 호출을 위임합니다.
주요 특징:
생성자 본문 내에서 함수 호출을 통해 다른 생성자를 호출할 수 있습니까?
아니오. 다른 생성자를 호출하는 것은 초기화 목록을 통해서만 가능하며 생성자 본문 내에서는 불가능합니다. 생성자 본문 내에서 함수를 호출하면 객체의 멤버가 이미 초기화됩니다.
생성자 간에 "환형" 위임을 생성하면 어떻게 됩니까?
환형 위임(예: A가 B를 위임하고, B가 A를 위임)은 C++ 컴파일 오류를 초래합니다: 생성자 간에 무한 재귀가 발생할 수 없습니다.
파생 클래스의 위임 생성자를 통해 기본 클래스의 생성자를 호출할 수 있습니까?
아니오. 위임 생성자는 동일 클래스 내에서만 작동합니다. 기본 생성자를 호출하기 위해서는 별도의 구문을 사용합니다:
class Base { public: Base(int) {} }; class Derived : public Base { public: Derived() : Base(42) {} };
세 개의 생성자가 있으며, 각 생성자는 필드를 명시적으로 초기화하고, 논리가 동기화되지 않음 — 하나의 생성자만 변경하면 나머지 두 개가 잘못됨.
장점:
단점:
하나의 주 생성자가 있고 나머지는 해당 생성자에게 위임하며, 모든 초기화 논리가 중앙 집중화됨.
장점:
단점: