[C++] 생성자의 초기화 리스트

·2023년 8월 19일
0

C++

목록 보기
6/17
post-custom-banner

생성자의 초기화 리스트 (initializer list)

#include <iostream>

class Marine 
{
    int hp;                // 마린 체력
    int coord_x, coord_y;  // 마린 위치
    int damage;            // 공격력
    bool is_dead;

public:
    Marine();              // 기본 생성자
    Marine(int x, int y);  // x, y 좌표에 마린 생성

    int attack();                       // 데미지를 리턴한다.
    void be_attacked(int damage_earn);  // 입는 데미지
    void move(int x, int y);            // 새로운 위치

    void show_status();  // 상태를 보여준다.
};

Marine::Marine() 
    : hp(50), coord_x(0), coord_y(0), damage(5), is_dead(false) 
{
}

Marine::Marine(int x, int y)
    : coord_x(x), coord_y(y), hp(50), damage(5), is_dead(false) 
{ }

void Marine::move(int x, int y) 
{
    coord_x = x;
    coord_y = y;
}

int Marine::attack() { return damage; }

void Marine::be_attacked(int damage_earn) 
{
    hp -= damage_earn;
    if (hp <= 0) is_dead = true;
}

void Marine::show_status() 
{
    std::cout << " *** Marine *** " << std::endl;
    std::cout << " Location : ( " << coord_x << " , " << coord_y << " ) "
        << std::endl;
    std::cout << " HP : " << hp << std::endl;
}

int main() 
{
    Marine marine1(2, 3);
    Marine marine2(3, 5);

    marine1.show_status();
    marine2.show_status();
}

실행 결과
Marine
Location : ( 2 , 3 )
HP : 50
Marine
Location : ( 3 , 5 )
HP : 50

비교

// (1) 이전 강의에서 사용한 방식
Marine::Marine() 
{
  hp = 50;
  coord_x = coord_y = 0;
  damage = 5;
  is_dead = false;
}

// (2) 생성자 초기화 리스트를 사용한 방식
Marine::Marine() 
	   : hp(50), coord_x(0), coord_y(0), damage(5), is_dead(false) 
{

}

위와 같이 생성자 이름 뒤에 : 멤버변수(값), ... 형식으로 오는 것을 초기화 리스트라고 부르며,
생성과 동시에 멤버 변수들을 초기화 해주는 역할을 함

차이점

(1)의 경우 생성을 먼저 하고 그 다음에 대입을 수행하게 됨
(2)는 생성과 초기화를 동시에 수행함

(2)가 조금 더 효율적일 뿐만 아니라 레퍼런스, 상수처럼 생성과 동시에 초기화 해야 하는 경우에도 오류 없이 적용 가능

post-custom-banner

0개의 댓글