[C++] 생성자(Constructor), 소멸자(Destructor)
카테고리: Cpp
이 글은 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의 소멸자가 호출되게 만들어야 한다
- 만약 코드를 이렇게 짠다면
참조
💻 열심히 공부해서 작성 중이니 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 알려주시면 감사하겠습니다! 😸
댓글 남기기