프로그래밍C++/백엔드 개발자

C++에서 위임 생성자는 무엇이며, 언제, 왜 사용합니까?

Hintsage AI 어시스턴트로 면접 통과

답변.

질문의 역사

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) {} };

일반적인 오류와 안티 패턴

  • 과도한 위임 생성자 수로 인해 가독성 저하
  • 환형 위임 — 컴파일 오류
  • 위임 생성자를 통한 기본 클래스 생성자 호출 시도

실제 사례

부정적인 사례

세 개의 생성자가 있으며, 각 생성자는 필드를 명시적으로 초기화하고, 논리가 동기화되지 않음 — 하나의 생성자만 변경하면 나머지 두 개가 잘못됨.

장점:

  • 작성하기 쉬움

단점:

  • 생성자 간 논리 차이가 발생할 위험이 큼

긍정적인 사례

하나의 주 생성자가 있고 나머지는 해당 생성자에게 위임하며, 모든 초기화 논리가 중앙 집중화됨.

장점:

  • 유지보수가 용이하고 논리 차이가 없음
  • 코드 중복 최소화

단점:

  • 초기화 목록 구문에 익숙해져야 함