• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

암시적 생성자 관련

24.03.14 13:14 작성 조회수 88

0

암시적 복사 생성자는 암시적 기본 생성자와는 달리 명시적으로 기타 생성자를 만들어도 그대로 작동이 잘 되는 것 같은데

문법 상으로 원래 이런 것인가요?

그리고 다른 객체들의 경우 return 0; 이후에 소멸자를 호출하고 있지만

Knight k5;

k5 = (Knight)1;의 k5는

return 0; 이전에 소멸자가 호출되는 것 같은데 이유가 무엇인가요?

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.16

안녕하세요, 인프런 AI 인턴입니다.
한울님, C++ 에서는 기본 생성자, 복사 생성자, 이동 생성자 등 여러 특별한 생성자들이 있습니다. 일반적으로 개발자가 클래스에 어떤 생성자도 명시적으로 정의하지 않았을 때 컴파일러가 암시적으로 기본 생성자를 제공합니다. 하지만, 개발자가 명시적으로 어떠한 생성자를 제공하면 컴파일러는 더 이상 암시적 기본 생성자를 제공하지 않습니다.

복사 생성자의 경우는 조금 다릅니다. 클래스에 대한 복사 생성자가 명시적으로 정의되지 않은 경우, C++ 컴파일러는 암시적 복사 생성자를 제공합니다. 즉, 개발자가 다른 생성자를 정의하더라도, 복사 생성자는 여전히 암시적으로 제공되는 것이 기본 동작입니다. 명시적으로 복사 생성자를 삭제하거나 private 접근 제한자를 설정하지 않는 이상, 복사 생성자는 사용할 수 있는 상태로 남게 됩니다.

소멸자의 호출 시점은 객체의 수명과 관련이 있습니다. 일반적으로 변수나 객체가 정의된 스코프를 벗어나면 소멸자가 호출됩니다. 지역 변수의 경우 해당 변수가 선언된 함수가 종료될 때 소멸자가 호출되고, 힙에 할당된 객체는 delete 연산을 통해 명시적으로 메모리를 해제할 때 소멸자가 호출됩니다.

Knight k5 = (Knight)1;의 경우 타입 캐스팅으로 인해 임시 객체가 생성되고, 이 임시 객체는 대입문이 실행된 직후, 즉 다음 문장으로 넘어가기 전에 소멸되기 때문에 k5가 아닌 임시 객체의 소멸자가 먼저 호출되는 것을 목격하실 수 있습니다. 하지만 return 0;이 있는 함수의 끝에서 k5 객체의 소멸자가 호출됩니다.

질문하신 내용이 C++의 암시적 생성자의 작동 방식과 소멸자의 호출에 대한 기본적인 이해에 도움이 되었으면 합니다.