초기화리스트 vs 대입 (10.02)

이정국(PBD)·2025년 10월 2일

TIL

목록 보기
54/70

1. 생성자 멤버 초기화 리스트 (Initializer List)

  • 동작 방식: 멤버 변수가 객체 생성과 동시에 초기화됨.
    즉, 메모리가 만들어질 때 바로 원하는 값으로 초기화.

장점

  • const 멤버, 참조형 멤버는 무조건 여기서만 초기화 가능.

  • 복사/대입 한 번 더 하지 않음 → 성능적으로 효율적.

  • 기본 생성자가 없는 클래스 멤버도 여기서만 초기화 가능.

*예시코드
class Player 
{
private:
    const int id;
    std::string name;
public:
    Player(int i, const std::string& n) 
        : id(i), name(n) {}  // 초기화 리스트에서 바로 생성
};

2. 본문에서 멤버 대입 (Assignment inside Constructor Body)

  • 동작 방식: 먼저 멤버가 기본 생성자(default constructor) 로 초기화됨.
    그 다음 생성자 본문에 들어와서 대입 연산이 실행됨.

단점

  • 불필요한 이중 작업(기본 생성 → 대입) 발생.

  • const, 참조 멤버는 아예 대입 불가능.

*예시코드
class Player {
private:
    int id;
    std::string name;
public:
    Player(int i, const std::string& n) {
        id = i;       // 기본 생성 후 대입
        name = n;     // 기본 생성 후 대입
    }
};

3. 초기화리스트 vs 대입 차이

std::string name; 이 있을 때:

  • 초기화 리스트: 바로 std::string(const std::string& n) 호출 → 한 번만 생성.

  • 본문 대입: std::string() 기본생성 → 그 다음 operator= 호출 → 총 두 번 호출.

4. 정리

  • 규칙적으로 무조건 초기화 리스트 먼저 고려 → const, 참조, 성능 문제 해결.

  • 본문 대입은 진짜 “로직상 필요할 때”만 사용
    → 예를 들어 초기화에 조건 분기나 복잡한 계산이 꼭 필요한 경우.

  • 기본형(int, float 등) 단순 타입은 성능 차이 미미하지만, 객체 타입(std::string, vector 등) 은 초기화 리스트 안 쓰면 손해.

profile
창백한 푸른점 속 작은점

0개의 댓글