C++ 클래스 - 파괴자(소멸자)

진경천·2023년 9월 16일
0

C++

목록 보기
38/90

소멸자는 객체의 수명이 끝나면 컴파일러에 의해 자동으로 호출되어 사용이 끝난 객체를 정리해준다.
소멸자의 이름은 해당 클래스의 이름과 같으며 이름 앞에 물결 표시(~)를 붙여 생성자와 구분한다.

~생성자 이름();
  • 소멸자의 특징
    1. 소멸자는 인수를 가지지 않는다.
    2. 소멸자는 반환값이 없지만 void형으로 선언하지 않는다.
    3. 객체는 여러 개의 생성자를 가질 수 있지만, 소멸자는 단 하나만 가질 수 있다.
    4. 소멸자는 const, volatile 또는 static으로 선언될 수는 없지만, const, volatile 또는 static으로 선언된 객체의 소멸을 위해서 호출될 수는 있다.

예제

#include <iostream>

using namespace std;

class Player {
private:
	int _num;

public:
	Player(int num) : _num(num) {
		cout << "Contructor : " << _num << endl;
	}
	~Player() {
		cout << "Destructor : " << _num << endl;
	}
};

Player player0(0);
Player* player1 = new Player(1);

void func() {
	static Player player2(2);
}

int main() {
	Player player3(3);
	Player* player4 = new Player(4);
	{
		Player player5(5);
		Player* player6 = new Player(6);
	}
	delete player4;
	func();
	func();
}
  • 실행 결과

    Contructor : 0     전역 변수 player0 생성
    Contructor : 1     전역 동적 변수 player1 생성
    Contructor : 3     main 함수 안의 변수 player3 생성
    Contructor : 4     main 함수 안의 동적 변수 player4 생성
    Contructor : 5     main 함수 블럭 안의 변수 player5 생성
    Contructor : 6     main 함수 블럭 안의 동적 변수 player6 생성
    Destructor : 5     블럭이 종료되며 player5 소멸
    Destructor : 4     delete에 의해 player4 소멸
    Contructor : 2     2번 선언하였지만 정적변수이기에 1번만 할당된 player2
    Destructor : 3     main 함수가 종료되며 player3 소멸
    Destructor : 2     프로그램이 종료되며 정적 변수 player2 소멸
    Destructor : 0     프로그램이 종료되며 전역 변수 player0 소멸

    player6은 동적 변수이기에 사용자가 따로 소멸시키지 않는 이상 소멸되지 않는다

문자열을 이용한 예제

_str을 동적 변수로 받아 소멸자로 해제를 해야한다.

#pragma warning(disable: 4996)

#include <iostream>
#include <cstring>

using namespace std;

class String {
private:
	char* _str;

public:
	String(const char* str) {
		int len = strlen(str);
		_str = new char[len];
		strcpy(_str, str);
	}

	~String() {
		delete[] _str;
	}

	void print() {
		cout << _str << endl;
	}
};

int main() {
	String str("abc");
	str.print();
}
  • 실행 결과

    abc

profile
어중이떠중이

0개의 댓글

관련 채용 정보