소멸자 란 무엇입니까?
소멸자는 객체가 소멸될 때마다 자동으로 호출되는 인스턴스 멤버 함수입니다. 즉, 소멸자는 객체가 파괴되기 전에 호출되는 마지막 함수입니다.
- 소멸자는 생성자와 같은 특수 멤버 함수이기도 합니다. 소멸자는 생성자가 만든 클래스 객체를 파괴합니다.
- 소멸자는 클래스 이름과 이름이 같고 앞에 물결표(~) 기호가 붙습니다.
- 둘 이상의 소멸자를 정의하는 것은 불가능합니다.
- 소멸자는 생성자가 만든 객체를 파괴하는 한 가지 방법일 뿐입니다. 따라서 소멸자는 오버로드될 수 없습니다.
- 소멸자는 인수가 필요하지 않으며 값도 반환하지 않습니다.
- 객체가 범위를 벗어나면 자동으로 호출됩니다.
- 생성자가 생성한 객체가 차지하는 소멸자 해제 메모리 공간입니다.
- 소멸자에서는 객체 생성과 반대로 객체가 파괴됩니다.
여기서 주의할 점은 객체가 new를 사용하여 생성되거나 생성자가 new를 사용하여 힙 메모리 또는 여유 저장소에 있는 메모리를 할당하는 경우 소멸자는 삭제를 사용하여 메모리를 해제해야 한다는 것입니다.
통사론
클래스 내에서 소멸자를 정의하는 구문은 다음과 같습니다.
~ () { // some instructions }> 클래스 외부에서 소멸자를 정의하는 구문은 다음과 같습니다.
:: ~() { // some instructions }> 실시예 1
아래 코드는 객체가 생성되고 소멸될 때 각각 생성자와 소멸자의 자동 실행을 보여줍니다.
C++
vlc에서 YouTube 비디오 다운로드
// C++ program to demonstrate the execution of constructor> // and destructor> #include> using> namespace> std;> class> Test {> public>:> >// User-Defined Constructor> >Test() { cout <<>'
Constructor executed'>; }> >// User-Defined Destructor> >~Test() { cout <<>'
Destructor executed'>; }> };> main()> {> >Test t;> >return> 0;> }> |
>
>산출
Constructor executed Destructor executed>
실시예 2
아래 코드는 여러 객체가 생성되고 소멸될 때마다 생성자와 소멸자의 자동 실행을 보여줍니다.
C++
// C++ program to demonstrate the execution of constructor> // and destructor when multiple objects are created> #include> using> namespace> std;> class> Test {> public>:> >// User-Defined Constructor> >Test() { cout <<>'
Constructor executed'>; }> >// User-Defined Destructor> >~Test() { cout <<>'
Destructor executed'>; }> };> main()> {> >// Create multiple objects of the Test class> >Test t, t1, t2, t3;> >return> 0;> }> |
>
>산출
Constructor executed Constructor executed Constructor executed Constructor executed Destructor executed Destructor executed Destructor executed Destructor executed>
실시예 3
아래 C++ 프로그램은 생성자와 소멸자가 호출되는 횟수를 보여줍니다.
C++
// C++ program to demonstrate the number of times> // constructor and destructors are called> #include> using> namespace> std;> static> int> Count = 0;>//It is static so that every class object has the same value> class> Test {> public>:> >// User-Defined Constructor> >Test()> >{> >// Number of times constructor is called> >Count++;> >cout <<>'No. of Object created: '> << Count> ><< endl;> >}> >// User-Defined Destructor> >~Test()> >{> > >cout <<>'No. of Object destroyed: '> << Count>//It will print count in> ><< endl;>//decending order> >Count--;> >// Number of times destructor is called> >}> };> // driver code> int> main()> {> >Test t, t1, t2, t3;> >return> 0;> }> |
>
>
산출
No. of Object created: 1 No. of Object created: 2 No. of Object created: 3 No. of Object created: 4 No. of Object destroyed: 4 No. of Object destroyed: 3 No. of Object destroyed: 2 No. of Object destroyed: 1>
메모: 객체는 생성된 순서와 반대 순서로 파괴됩니다. 이 경우 t3이 가장 먼저 소멸되고 t가 마지막으로 소멸됩니다.
소멸자의 속성
소멸자의 주요 속성은 다음과 같습니다.
- 소멸자 함수는 객체가 소멸될 때 자동으로 호출됩니다.
- static이나 const로 선언할 수 없습니다.
- 소멸자에는 인수가 없습니다.
- void도 아닌 반환 유형이 없습니다.
- 소멸자가 있는 클래스의 객체는 공용체의 구성원이 될 수 없습니다.
- 소멸자는 클래스의 공개 섹션에 선언되어야 합니다.
- 프로그래머는 소멸자의 주소에 접근할 수 없습니다.
소멸자는 언제 호출되나요?
객체가 범위를 벗어나면 소멸자 함수가 자동으로 호출됩니다.
- 기능이 종료됩니다
- 프로그램이 종료됩니다
- 지역 변수를 포함하는 블록이 끝납니다.
- 삭제 연산자가 호출됩니다.
메모: 파괴자 객체에 대해 명시적으로 호출할 수도 있습니다.
소멸자를 명시적으로 호출하는 방법은 무엇입니까?
다음 명령문을 사용하여 소멸자를 명시적으로 호출할 수 있습니다.
object_name.~class_name()>
소멸자는 일반 멤버 함수와 어떻게 다른가요?
- 소멸자는 클래스 이름 앞에 물결표(~)가 붙는 이름을 갖습니다.
- 소멸자는 인수를 받지 않으며 아무것도 반환하지 않습니다.
C++
#include> using> namespace> std;> class> String {> private>:> >char>* s;> >int> size;> public>:> >String(>char>*);>// constructor> >~String();>// destructor> };> String::String(>char>* c)> {> >size =>strlen>(c);> >s =>new> char>[size + 1];> >strcpy>(s, c);> }> String::~String() {>delete>[] s; }> int> main()> {> >String str =>'Hello, World!'>;> >String myString(str);> >cout <<>'String: '> << myString.s << endl;> >return> 0;> }> |
>
>
한 클래스에 소멸자가 두 개 이상 있을 수 있나요?
아니요, 클래스 이름 앞에 ~가 있고 매개변수도 없고 반환 유형도 없는 소멸자는 클래스에 하나만 있을 수 있습니다.
사용자 정의 소멸자는 언제 작성해야 합니까?
클래스에 자체 소멸자를 작성하지 않으면 컴파일러는 기본 소멸자를 생성합니다. 클래스에 메모리나 포인터를 동적으로 할당하지 않는 한 기본 소멸자는 잘 작동합니다. 클래스에 할당된 메모리에 대한 포인터가 포함된 경우 클래스 인스턴스가 파괴되기 전에 메모리를 해제하기 위해 소멸자를 작성해야 합니다. 메모리 누수를 방지하려면 이 작업을 수행해야 합니다.
피트 데이비슨 국적
소멸자는 가상일 수 있나요?
예, 사실 가상 함수가 있는 경우 기본 클래스에서 소멸자를 가상으로 만드는 것은 항상 좋은 생각입니다. 자세한 내용은 가상 소멸자를 참조하세요.
소멸자에 대한 퀴즈를 풀고 싶을 수도 있습니다.
관련 기사
- C++의 생성자
- 가상 파괴자
- C++의 순수 가상 소멸자