Knight k;가 왜 막히는지 설명할 수 있다.Knight() { } → 기본 생성자.class Knight {
public:
Knight() : _hp(0), _attack(0), _defence(0) {}
private:
int _hp;
int _attack;
int _defence;
};
핵심 포인트:
_hp = 0;처럼 넣기보다, 위처럼 초기화 리스트로 초기화하는 습관이 좋습니다.class Knight {
public:
Knight() = default; // 기본 생성자
private:
int _hp = 0;
int _attack = 0;
int _defence = 0;
};
이 방식은 “기본값”을 한 곳에 모아두기 좋고, 생성자 오버로딩이 많아질수록 유리합니다.
~Knight() { } → 이름 앞에 ~.~Knight() {
std::cout << "~Knight()" << '\n';
}
주의:
Knight(int hp, int attack, int defence) → 인자를 받는 생성자.Knight(int hp, int attack, int defence)
: _hp(hp), _attack(attack), _defence(defence)
{
}
Knight k1(100, 10, 1); // 직접 초기화
Knight k2 = Knight(100, 10, 1); // 복사 초기화
Knight k3{100, 10, 1}; // 유니폼 초기화 (C++11 이상)
Knight k1;처럼 “기본 생성”을 하려고 하면 막힙니다.📌 오류 C2512: 적절한 기본 생성자가 없습니다.
Knight() { ... }Knight() = default;Knight(const Knight& other) 형태로 받는 게 기본.Knight k2 = k1; → 복사 생성자 호출.const 참조로 받아야 원본 수정 방지 + 성능 향상.Knight(const Knight& other) {
this->_hp = other._hp;
this->_attack = other._attack;
this->_defence = other._defence;
}
int 같은 값만 들고 있다면, 보통은 복사 생성자/소멸자를 직접 만들 필요가 없습니다.0xCCCCCCCC 같은 패턴으로 보이는 경우가 있습니다._hp = -858993460 (0xCCCCCCCC)int 같은 기본 타입은 차이 없지만, 클래스 타입은 생성·소멸 비용이 있어 성능 차이 가능.┌─────────────────────────────────────────────────────────────────────────────┐
│ for (int i = 0; i < 10; i++) { │ Knight k; │
│ Knight k; // 매 반복마다 │ for (int i = 0; i < 10; i++) { │
│ // ... │ // k 사용 │
│ } // k 범위 끝 → 소멸자 │ } // k 범위 끝 → 소멸자 1번 │
├─────────────────────────────────────────────────────────────────────────────┤
│ 생성자 → 소멸자 (10번 반복) │ 생성자 1번 → 소멸자 1번 │
│ │ │ │ │
│ ├─ i=0: Knight() → ~Knight() │ ├─ Knight() 1번 │
│ ├─ i=1: Knight() → ~Knight() │ ├─ 루프 10번 (k 재사용) │
│ ├─ ... │ └─ ~Knight() 1번 │
│ └─ i=9: Knight() → ~Knight() │ │
│ (클래스 타입은 이 방식이 비효율) │ (동일 용도면 이 방식이 효율) │
└─────────────────────────────────────────────────────────────────────────────┘
// case 1: 매 반복마다 생성/소멸
for (int i = 0; i < 10; i++) {
Knight k; // 생성자 → 소멸자 (반복)
}
// case 2: 한 번만 생성/소멸
Knight k;
for (int i = 0; i < 10; i++) {
// k 사용
} // 여기서 소멸자 1번
Knight k;가 막히는 이유는?