const 멤버, 참조형 멤버는 무조건 여기서만 초기화 가능.
복사/대입 한 번 더 하지 않음 → 성능적으로 효율적.
기본 생성자가 없는 클래스 멤버도 여기서만 초기화 가능.
*예시코드
class Player
{
private:
const int id;
std::string name;
public:
Player(int i, const std::string& n)
: id(i), name(n) {} // 초기화 리스트에서 바로 생성
};
불필요한 이중 작업(기본 생성 → 대입) 발생.
const, 참조 멤버는 아예 대입 불가능.
*예시코드
class Player {
private:
int id;
std::string name;
public:
Player(int i, const std::string& n) {
id = i; // 기본 생성 후 대입
name = n; // 기본 생성 후 대입
}
};
초기화 리스트: 바로 std::string(const std::string& n) 호출 → 한 번만 생성.
본문 대입: std::string() 기본생성 → 그 다음 operator= 호출 → 총 두 번 호출.
규칙적으로 무조건 초기화 리스트 먼저 고려 → const, 참조, 성능 문제 해결.
본문 대입은 진짜 “로직상 필요할 때”만 사용
→ 예를 들어 초기화에 조건 분기나 복잡한 계산이 꼭 필요한 경우.
기본형(int, float 등) 단순 타입은 성능 차이 미미하지만, 객체 타입(std::string, vector 등) 은 초기화 리스트 안 쓰면 손해.