본문 바로가기

C++

[C++] 생성자와 소멸자

생성자와 소멸자는 클래스 객체가 생성 및 소멸될 때 자동으로 호출되는 함수이다. 생성자와 소멸자는 반환 형식이 없다는 것이 특징이다.

 

//생성자
클래스이름();
//소멸자
~클래스이름();

 

소멸자는 생성자앞에 물결표시(tildar 틸다)로 표기한다.

 

 

생성자와 소멸자의 핵심내용은 다음과 같다.

 

  1. 생성자는 다중 정의할 수 있다.
  2. 소멸자는 다중 정의할 수 없다.
  3. 전역 변수로 클래스를 선언하면 main함수보다 먼저 호출된다.
  4. main함수가 끝난 후에 소멸자가 호출될 수 있다.
  5. 생성자와 소멸자를 기술하지 않으면 컴파일러가 자동으로 생성한다.

 

생성자와 소멸자의 호출 시기를 보자.

 

#include <iostream>
using namespace std;

class myClass
{
public:
	//생성자
	myClass(int x)
		: num(x)	//초기화
	{
		cout << "class start num : " << num << endl;
	}

	//생성자 다중정의
	myClass(int x, int y)
		: num(x + y)	//초기화
	{
		cout << "class start num : " << num << endl;
	}

	int num;	//멤버 변수

	//소멸자
	~myClass() {
		cout << "class end num : " << num << endl;
	}
	

};

int main()
{
	cout << "main start" << endl;
	//myClass myClass;	에러 기본 생성자없음
	myClass myClass1(10);
	myClass myClass2(3, 4);
	cout << "main end" << endl;

	return 0;
}

 

결과값:

main start
class start num : 10
class start num : 7
main end
class end num : 7
class end num : 10

 

생성자는 객체가 생성될 때, 소멸자는 main함수가 끝나고 호출되는것을 확인할 수 있다.

 

 

다음은 인스턴스가 참조형 멤버일때 예제이다.

 

class myClass
{
public:

	myClass(int &x) : num(x) {}

	//참조자 초기화 에러, 초기화가 아니라 단순대입
	//myClass(int& x) { num = x; }	에러

	//쓰레기값 유지, 참조자 사라짐
	//myClass(int x) : num(x) {}

	int getNum() { return num; }

	//참조형 멤버
	int &num;
	

};

int main()
{
	int x = 10;
	myClass myClass(x);

	cout << myClass.getNum() << endl;

	x = 20;
	cout << myClass.getNum() << endl;

	return 0;
}

 

결과값:

10
20

 

참조자는 반드시 선언과 동시에 초기화 해야한다. 그리고 멤버 변수가 참조자 형식이면 반드시 초기화 목록을 이용해 초기화해야한다.

생성자의 매개변수를 참조 형식이 아니면 함수의 매개변수는 함수 내부의 자동 변수와 같으므로 함수가 반활될 때 매개변수는 소멸된다. 따라서 쓰레기값이 출력된다.

'C++' 카테고리의 다른 글

[C++] 복사 생성자(copy constructor)  (0) 2019.12.17
[C++] 메모리 동적 할당 new와 delete 연산자  (0) 2019.12.17
[C++] 참조자(Reference)  (0) 2019.12.16
[C++] this 포인터  (0) 2019.12.15
[C++] 클래스와 메소드  (0) 2019.12.15