🙇‍♀️생성자와 소멸자

[생성자(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;
}

소멸자는 한번만 만들 수 있으며 생성자가 소멸할 때 호출된다.

태그:

카테고리:

업데이트: