앞 절에서 설명한 것처럼 클래스 객체가 생성될 때 자동으로 호출되는 생성자 외에 객체가 소멸될 때 자동으로 호출되는 함수도 클래스 이름과 동일하며 반환 값이 없습니다. 이름 앞에 물결표 ~가 있습니다. 용도 생성자를 구별하기 위해 해당 기능은 주로 개체가 해제된 후 여파를 정리하는 데 사용됩니다. 소멸자 입니다.
생성자 및 클래스 이름과 동일하며 반환 값이 없습니다. 사용자가 정의하지 않으면 시스템이 자동으로 빈 소멸자를 생성합니다. 사용자가 정의한 후에는 객체가 소멸될 때 자동으로 호출됩니다.
생성자와는 달리 둘 다 공개 유형입니다. 생성자는 오버로드될 수 있고 여러 형제가 있을 수 있지만 소멸자는 오버로드될 수 없지만 가상 함수일 수 있으며 클래스에는 소멸자가 하나만 있을 수 있습니다.
다음으로 Student 클래스를 예로 들어 소멸자를 계속 추가합니다. 동시에 생성자와 소멸자 모두에 현재 클래스에 대한 정보를 추가하여 어떤 클래스가 생성되고 소멸되는지를 주의 깊게 읽어보세요. :
#include<iostream>#include<Cstring>usingnamespacestd;classStudent{private:intnum;//학생 번호 charname[100];//name intscore;//score public:Student(intn,char*str,ints);~Student ();intprint();intSet(intn,char*str,ints);};Student::Student(intn,char*str,ints){num=n;strcpy(name,str);score=s;cout <<num<<<<name<<<<score<<;cout<<Constructor<<endl;}Student::~Student(){cout<<num<<<<name<<<<score<<; cout<<destructor<<endl;}intStudent::print(){cout<<num<<<<name<<<<score<<endl;return0;}intStudent::Set(intn,char*str,ints) {num=n;strcpy(name,str);score=s;}intmain(){StudentA(100,dot,11);StudentB(101,cpp,12);return0;}
위 코드의 생성자와 소멸자를 잘 이해하시고, 메인 함수에 두 개의 객체 A와 B가 정의되어 있다는 점을 참고하시고, 자신의 컴퓨터에서 테스트해 보시면 다음과 같은 실행 효과를 보실 수 있습니다.
A 객체와 B 객체의 생성자를 호출하는 순서와 소멸자를 호출하는 순서가 완전히 반대인 것을 알 수 있습니다! 그 이유는 객체 A와 B가 모두 로컬 객체이고 스택 영역에도 저장되기 때문입니다. 또한 "선입, 후출" 순서를 따릅니다.
꼭 직접 테스트해보고 결과를 확인해 보세요!