| 함수 | 설명 |
|---|---|
| 생성자(Constructor) | 객체가 생성될 때 호출되는 특수한 함수 |
| 소멸자(Destructor) | 객체가 소멸될 때 호출되는 특수한 함수 |
Knight 클래스 설계)#include <iostream> // 입출력 기능 제공
using namespace std; // std:: 생략
#include <iostream> : cout, cin을 사용하기 위해 포함 using namespace std; : std::cout 대신 cout으로 사용 가능 Knight 클래스 선언class Knight
{
public:
// [1] 기본 생성자 (인자가 없음)
Knight()
{
cout << "Knight() 기본 생성자 호출" << endl;
_hp = 100;
_attack = 10;
_posX = 0;
_posY = 0;
}
📌 기본 생성자
hp, attack, posX, posY를 초기화"Knight() 기본 생성자 호출" // [2] 복사 생성자 : 자기 자신의 클래스 참조 타입을 인자로 받음
// 같은 데이터를 가진 객체가 생성되길 기대함
Knight(const Knight& knight)
{
cout << "Knight(const Knight&) 복사 생성자 호출" << endl;
_hp = knight._hp;
_attack = knight._attack;
_posX = knight._posX;
_posY = knight._posY;
}
📌 복사 생성자
"Knight(const Knight&) 복사 생성자 호출"📌 사용 예시
Knight k2(k1); // k1을 복사하여 k2 생성 (복사 생성자 호출)
Knight k3 = k1; // k1을 복사하여 k3 생성 (복사 생성자 호출)
// [3] 기타 생성자 (인자를 받는 생성자)
explicit Knight(int hp)
{
cout << "Knight(int) 생성자 호출" << endl;
_hp = hp;
_attack = 10;
_posX = 0;
_posY = 0;
}
📌 기타 생성자 (타입 변환 생성자)
explicit을 사용하면 암시적 형변환 방지"Knight(int) 생성자 호출"📌 암시적 형변환 방지
Knight k5 = 1; // ⚠️ 암시적 변환 허용되지 않음 (explicit 때문)
Knight k5 = (Knight)1; // ✅ 명시적 변환 필요
Knight(int hp, int attack, int posX, int posY)
{
_hp = hp;
_attack = attack;
_posX = posX;
_posY = posY;
}
📌 다양한 초기화 방식 지원
Knight k1(100, 10, 0, 0); // 4개의 값으로 초기화
// [4] 소멸자
~Knight()
{
cout << "Knight() 소멸자 호출" << endl;
}
📌 소멸자
"Knight() 소멸자 호출"📌 소멸자 호출 시점
{
Knight k1;
} // ⚠️ k1이 스코프를 벗어나면서 소멸자 호출됨
void Move(int y, int x);
void Attack();
void Die()
{
_hp = 0;
cout << "Die" << endl;
}
Move() : posX, posY 변경Attack() : 공격 수행Die() : hp를 0으로 설정 후 "Die" 출력main() 함수 - 객체 생성 및 사용int main()
{
// 기본 생성자 호출
Knight k1;
// 복사 생성자 호출
Knight k2(k1);
Knight k3 = k1;
// 복사 연산자 (대입 연산)
Knight k4;
k4 = k1;
k1.Move(2, 2);
k1.Attack();
k1.Die();
// 암시적 형변환 (explicit 사용 시 에러 발생)
Knight k5;
k5 = (Knight)1; // 명시적 형변환만 가능
return 0;
}
📌 출력 예시
Knight() 기본 생성자 호출
Knight(const Knight&) 복사 생성자 호출
Knight(const Knight&) 복사 생성자 호출
Knight() 기본 생성자 호출
Move
Attack
Die
Knight() 소멸자 호출
Knight() 소멸자 호출
Knight() 소멸자 호출
Knight() 소멸자 호출
Knight() 소멸자 호출
explicit 키워드와 타입 변환explicit Knight(int hp)
📌 암시적 형변환 방지
Knight k5 = 1; // ❌ 암시적 형변환 → 오류 발생
Knight k5 = (Knight)1; // ✅ 명시적 형변환 필요
📌 암시적 형변환 예제
float f = num; // 암시적 형변환
float f = (float)num; // 명시적 형변환
this 포인터void Die()
{
_hp = 0;
this->_hp = 1; // this는 자기 자신을 가리킨다
cout << "Die" << endl;
}
📌 this 포인터