생성자와 소멸자
생성자 Constructor, 소멸자 Destructor
- 클래스 객체가 소멸될 떄 자동으로 호출되는 함수 (소멸자)
- 함수임에도 불구하고 반환 형식이 없다.
- 함수 이름이 클래스 이름과 같다.
- 소멸자 이름 앞에는 ~가 붙는다.
생성자와 소멸자의 차이점
- 생성자는 다중 정의할 수 있고 소멸자는 하나만 정의가능하다.
디폴트 생성자
- 매개변수가 하나도 없는 생성자
- 클래스 제작자가 디폴트 생성자와 소멸자를 기술하지 않아도 컴파일러가 알아서 만들어 넣는다.
- 아무런 코드도 추가되지 않지만 내부적으로 컴파일러가 만든다
- 생성자와 소멸자가 없는 클래스는 없다고 생각하면 된다.
클래스가 소멸되는 시점
- 선언된 블록 범위가 끝나면 자동 소멸한다.
class CTest
{
public:
CTest() {
cout << "CTest" <<endl;
};
~CTest(){
cout << "~CTest" <<endl;
};
};
int main(){
cout << "Begin" <<endl;
CTest t; //main에속한 지역변수이기 때문에 main블럭이 끝나면 자동으로 소멸된다.
cout << "End" <<endl;
return 0;
} //이블럭이 끝나고 인스턴스 t가 소멸된다.
결과
Begin
CTest
End
~CTest
CTest 클래스의 인스턴스를 전역변수로 선언했을 때 생성, 소멸 시점
- 전역 변수로 선언한 클래스의 생성자가 main() 함수보다 먼저 호출된다.
: C로 작성한 프로그램에서 가장 먼저 호출되는 함수는 main()함수다.라는 명제와는 다르다는 점 꼭기억!
- 메인함수가 끝난 후에 소멸자가 호출된다.
class CTest
{
public:
CTest() {
cout << "CTest" <<endl;
};
~CTest(){
cout << "~CTest" <<endl;
};
};
CTest t;
int main(){
cout << "Begin" <<endl;
cout << "End" <<endl;
return 0; //End다음 ~CTest가 출력된다.
}
결과
CTest
Begin
End
~CTest
새로운 생성자를 정의한다면 디폴트 생성자는 컴파일러가 정의하지 않는다.
class CTest
{
int m_nData;
public:
CTest(int nParam):m_nData(nParam){
cout << "CTest" <<endl;
};
~CTest(){
cout << "~CTest" << m_nData <<endl;
};
//디폴트 생성자가 생성되지 않는 것을 명시적으로 표시하기위해 delete 예약어를 사용해서 생성자를 삭제해준다.
CTest(void) = delete;
};
int main(){
CTest a(1);
CTest b(1);
CTest c; // (오류발생) 디폴트 생성자가 생성되지 않으므로 이렇게 인스턴스를 생성할 수 없다.
return 0;
}
정리
- main()함수가 호출되기전에 생성자가 호출될 수 있다.
- 생성자는 다중 정의할 수 있다.
- 소멸자는 다중 정의할 수 없다.
- main()함수가 끝난 후에 소멸자가 호출될 수 있다.
- 생성자와 소멸자는 생략할 수 있으나 생략할 경우 컴파일러가 만들어 넣는다.
'◼️C++' 카테고리의 다른 글
[C++] 참조형식 멤버변수 초기화 (생성자초기화목록 이용) (0) | 2023.09.17 |
---|---|
[C++] 동적 객체의 생성과 소멸 (0) | 2023.09.17 |
[C++] 클래스 접근 제어 지시자 (0) | 2023.09.17 |
[C++] 클래스 기본 문법 (0) | 2023.09.17 |
[C++] 객체지향 프로그래밍 개요 (0) | 2023.09.17 |