프로그래밍C++ 개발자

C++에서 기본 생성자(default constructor)는 어떻게 작동하나요? 클래스에 생성자를 하나도 선언하지 않으면 어떻게 되며, 다른 생성자는 선언했지만 기본 생성자는 선언하지 않으면 어떻게 되나요?

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

답변

C++에서 _기본 생성자_는 매개변수가 없는 생성자 또는 모든 매개변수가 기본값을 가지는 생성자입니다. 클래스에 어떠한 생성자도 선언되지 않은 경우, 컴파일러는 자동으로 public 기본 생성자를 생성합니다. 그러나 어떠한 다른 생성자가 선언되면(예: 매개변수가 있는 생성자), 컴파일러가 자동으로 제공하는 기본 생성자는 생성되지 않습니다. 그런 클래스에서 기본 생성자가 필요하다면, 명시적으로 선언해주어야 합니다(예: ClassName() = default; 사용).

코드 예제

class Foo { public: Foo(int x) {} // 사용자 정의 생성자 // Foo() 기본 생성자는 컴파일러에 의해 이미 생성되지 않습니다! }; Foo f; // 컴파일 오류 — 기본 생성자가 없습니다!

기본 생성자를 명시적으로 만들기 위해서는 다음과 같이 추가해야 합니다:

class Foo { public: Foo() = default; Foo(int x) {} };

트리키 질문

«매개변수가 있는 생성자만 하나 있다면, 이 클래스의 객체를 매개변수 없이 생성할 수 있나요? 왜 그렇죠?»

답변: 안 됩니다! 이유는, 어떠한 생성자든 선언되면, 컴파일러는 더 이상 기본 생성자를 자동으로 추가하지 않기 때문입니다. 매개변수 없이 객체를 만들기 위해서는 기본 생성자를 명시적으로 추가해야 합니다.


이 주제에 대한 지식 부족으로 인한 실제 오류 예시.


이야기

한 대형 프로젝트에서 데이터 직렬화를 위한 클래스 계층 구조가 작성되었으며, 모든 "자식" 클래스는 특정 매개변수 생성자만 가졌습니다. 리팩토링 후 STL 컨테이너(예: std::vector)를 이 클래스들과 함께 사용할 때 컴파일이 실패하는 것을 발견했습니다: 컨테이너는 없었던 기본 생성자가 필요했습니다. 문제는 기본 생성자를 명시적으로 선언한 후에야 해결되었습니다.


이야기

템플릿을 사용하는 프로젝트에서, 리소스를 전송하기 위해 매개변수 생성자만을 선언한 어댑터 클래스를 갖고 있었습니다. 이때, 특정 라이브러리는 기본 생성자가 필요하여 정상적으로 작동해야 했습니다(템플릿 타입을 통해 임시 객체가 생성되므로). 설명할 수 없는 신비한 링크 오류가 발생했으며, 기본 생성자를 명시적으로 구현하기 전까지는 문제를 해결할 수 없었습니다.


이야기

코드에서 C++98에서 C++11로의 마이그레이션이 발생했고, 기본 생성자를 명시적으로 선언하기 위해 "= default"를 사용하려 했습니다. 오래된 컴파일러에서 오류가 발생하거나 새로운 문법 구조를 무시했습니다. 이는 모든 개발자가 컴파일러에 의해 생성된 기본 생성자와 "= default"의 새로운 문법 사이의 차이를 이해하지 못한다는 것을 드러냈습니다.