[C++] 생성자(Constructor), 소멸자(Destructor)

Date:     Updated:

카테고리:

태그:

이 글은 C++ 생성자(Constructor), 소멸자(Destructor)를 공부하고 정리한 글입니다

코드 예시

class Vector
{
public:
    Vector() : mX(0), mY(0)
    {
    }
    // 복사 생성자
    Vector(const Vector& other) : mX(other.mX), mY(other.mY)
    {
    }
    // 소멸자
    ~Vector()
    {
    }
    virtual ~Vector()
    {
    }
private:
    int mX;
    int mY;
};

생성자

  • 개체가 생성될 때 호출된다
  • 보통 메모리 할당을 여기서 해줌

    기본 생성자

    • 매개변수를 받지 않음
    • 클래스에 생성자가 없으면 컴파일러가 기본 생성자를 자동적으로 만들어 줌
    • 자동적으로 만들어진 생성자는
      • 멤버 변수를 초기화하지 않음
      • 하지만 모든 포함된 개체의 생성자를 호출

    복사 생성자

    • 캍은 클래스에 속한 다른 개체를 이용하여 새로운 개체를 초기화
      • 같은 크기, 같은 데이터
    • 코드에 복사 생성자가 없는 경우, 컴파일러가 암시적 복사 생성자를 자동생성
      • 암시적 복사 생성자는 얕은 복사(shallow copy)를 수행
    • 만약 클래스 안에서 동적으로 메모리를 할당하고 있다면 얕은 복사로 인해 위험할 가능성이 높기때문에
    • 직접 복사 생성자를 만들어서 깊은 복사(deep copy)를 할 것
      • 포인터 변수가 가리키는 실제 데이터까지도 복사

초기화 리스트(Initializer List)

  • 멤버 변수를 대입 없이 초기화
  • 상수나 참조 변수도 초기화 가능

소멸자

  • 개체가 지워질 때 호출됨
  • 보통 메모리 해제를 여기서 해줌

가상 소멸자

class Animal
{
public :
    virtual ~Animal();
};
  • 왜 가상 소멸자를 사용할까?
    • 만약 코드를 이렇게 짠다면
      Animal* cat = new Cat();
      delete cat;
      
    • delete를 해줄때 정적 바인딩으로 인해 Cat의 소멸자가 아닌 Animal의 소멸자가 호출된다
    • 그래서 만약 Cat의 생성자에서 메모리 할당을 해줬을 경우 메모리 해제를 해주는 소멸자가 호출되지 않기 때문에
    • 메모리 누수(Memory Leak)이 발생된다
    • 따라서 Animal의 소멸자를 가상 소멸자로 바꾸어 동적바인딩으로 Cat의 소멸자가 호출되게 만들어야 한다


참조

포큐아카데미 C++ 언매니지드 프로그래밍



💻 열심히 공부해서 작성 중이니 오류나 틀린 부분이 있을 경우 
  언제든지 댓글 혹은 메일로 알려주시면 감사하겠습니다! 😸

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기