C++ Rookiss Part1 C++ 프로그래밍 입문 : 생성자와 소멸자
🙇♀️생성자와 소멸자
[생성자(Constructor)와 소멸자(Destructor)] 클래스에 ‘소속’된 함수들을 멤버함수라고 함 이 중에서 굉장히 특별한 함수 2종이 있는데, 바로 [시작]과 [끝]을 알리는 함수들
- 시작(탄생) -> 소멸자 (여러개 존재 가능)
- 끝(소멸) -> 소멸자 (오직 1개만)
🪐생성자
[암시적(Implicit) 생성자] 생성자를 명시적으로 만들지 않으면, 아무 인자도 받지 않는 [기본 생성자]가 컴파일러에 의해 자동으로 만들어짐 -> 그러나 우리가 명시적(Explicit)으로 아무 생성자 하나 만들면, 자동으로 만들어지던 [기본 생성자]는 더 이상 만들어지지 않음!
기본 생성자와 복사 생성자는 자동으로 생성됨
🪐기본 생성자
// [1] 기본 생성자 (인자가 없음)
Knight()
{
cout << "Knight() 기본 생성자 호출" << endl;
_hp = 100;
_attack = 10;
_posY = 0;
_posX = 0;
}
인자가 없는 생성자는 명시적으로 생성해 주지 않아도 컴파일러가 자동으로 생성해 준다. 하지만 명시적으로 생성자를 만들어 줄 경우 기본 생성자를 자동으로 생성해 주지 않는다.
🪐복사 생성자
// [2] 복사 생성자 (자기 자신의 클래스 참조 타입을 인자로 받음)
// (일반적으로 '똑같은' 데이터를 지닌 객체가 생성되길 기대한다)
Knight(const Knight& knight)
{
_hp = knight._hp;
_attack = knight._attack;
_posX = knight._posX;
_posY = knight._posY;
}
사용법 :
Knight k2(k1);
Knight k3 = k1;
특이한 점은 만약 Knight k4; // 생성자
, k4 = k1; // 복사
를 할 경우에는 복사 생성자가 만들어지지 않는다.
이 경우에는 기본 생성자가 만들어진 후에 복사가 일어난다.
🪐기타 생성자
// [3] 기타 생성자
// 이 중에서 인자를 1개만 받는 [기타 생성자]를
// [타입 변환 생성자]라고 부르기도 함
// 명시적인 용도로만 사용할 것!
// explicit
explicit Knight(int hp)
{
cout << "Knight(int) 생성자 호출" << endl;
_hp = hp;
_attack = 10;
_posY = 0;
_posX = 0;
}
Knight(int hp, int attack, int posX, int posY)
{
_hp = hp;
_attack = 10;
_posY = 0;
_posX = 0;
}
- 암시적 형변환
- 컴파일러가 알아서 바꿔치기 해주는 것
float f = (float)num; // 명시적 < 우리가 코드로 num을 flaot바구니에 넣으라고 주문하고 있음
double d = num; // 암시적 << 별말 안했는데 컴파일러가 알아서 처리하고 있음
Knight k5;
//k5 = 1; // 타입 변환 생성자때문에 에러가 없음
k5 = (Knight)1;
//HelloKnight(5);
HelloKnight((Knight)5);
🪐소멸자
// 소멸자
~Knight()
{
cout << "~Knight() 소멸자 호출" << endl;
}
소멸자는 한번만 만들 수 있으며 생성자가 소멸할 때 호출된다.