생성자와 소멸자는 클래스 객체가 생성 및 소멸될 때 자동으로 호출되는 함수이다. 생성자와 소멸자는 반환 형식이 없다는 것이 특징이다.
//생성자
클래스이름();
//소멸자
~클래스이름();
소멸자는 생성자앞에 물결표시(tildar 틸다)로 표기한다.
생성자와 소멸자의 핵심내용은 다음과 같다.
- 생성자는 다중 정의할 수 있다.
- 소멸자는 다중 정의할 수 없다.
- 전역 변수로 클래스를 선언하면 main함수보다 먼저 호출된다.
- main함수가 끝난 후에 소멸자가 호출될 수 있다.
- 생성자와 소멸자를 기술하지 않으면 컴파일러가 자동으로 생성한다.
생성자와 소멸자의 호출 시기를 보자.
#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 #
};
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 |