생성자와 소멸자

 

인프런 Rookiss님의 'Part1: C++ 프로그래밍 입문' 강의를 기반으로 정리한 필기입니다. 
😎[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 강의 들으러 가기!

 

 


 

생성자 (Constructor)

 

객체가 생성된 후에는 반드시 객체를 초기화하여야 한다. 객체를 초기화하지 않으면 쓰레기값을 가지게 된다.

 

"

객체의 초기화  =  멤버 변수의 값을 초기화  +  객체의 동작에 필요한 메모리 공간이나 기타자원들을 할당

"

 

 

생성자(Constructor)를 사용하면 객체의 생성과 동시에 초기화가 가능하다.

 

클래스에 '소속'된 함수들을 멤버 함수라고 한다. 이 중에서 굉장히 특별한 함수 2종이 있는데, 바로 [시작]과 [끝]을 알리는 함수가 생성자와 소멸자이다.

 

 

생성자는 값을 반환하거나 매개 변수를 사용할 수 없다.

  • 시작(탄생)  →  생성자 (여러개 존재 가능)
  • 끝(소멸)        소멸자 (오직 1개만 존재)

 

 


 

생성자 타입  -  기본, 복사, 디폴트, 타입변환 생성자

 

   
 기본 생성자  매개변수를 통해 객체가 생성될 때 전달받은 인자 값으로 멤버 변수를 초기화
 복사 생성자  자기 자신의 클래스 참조 타입을 인자 값으로 받아 멤버 변수를 초기화
 디폴트 생성자  객체를 생성할 때 아무런 인자를 넘겨주지 않을 때 멤버 변수를 초기화. 
 매개변수를 가지지 않는다.
기타(타입 변환) 생성자  인자 1개만 받는다.

 

class Knight
{
public:
    // [1] 기본 생성자 (인자가 없음)
    Knight()
    {
        cout << "Knight() 기본 생성자 호출" << endl;

        _hp = 100;
        _attack = 10;
        _posX = 0;
        _posY = 0;
    }

    // [2] 복사 생성자 : 자기 자신의 클래스 참조 타입을 인자로 받음.
    // 일반적으로 '똑같은' 데이터를 지닌 객체가 생성되길 기대한다
    // 일반적으로 복사생성자는 데이터를 복사해서 사용하겠다는 의미이기 때문에 대부분의 경우(99%) const를 붙인다.
    Knight(const Knight& knight)
    {
        _hp = knight._hp;
        _attack = knight._attack;
        _posX = knight._posX;
        _posY = knight._posY;
    }

 // [3] 기타 생성자
    Knight(int hp)
    {
        cout << "Knight(int) 기본 생성자 호출" << endl;

        _hp = hp;
        _attack = 10;
        _posX = 0;
        _posY = 0;
    }

    // 소멸자
    ~Knight()
    {
        cout << "Knight() 소멸자 호출" << endl;
    }
}

 

1.  k1 바구니(=Knight k1의 스택 주소)를 ecx 레지스터에 담는다.

2.  Knight::Knight 생성자를 호출한다.

 

 

1.  k1 바구니(=Knight k1의 스택 주소)를 ecx 레지스터에 담는다.

2.  Knight::~Knight 소멸자를 호출한다.

 


 

 

암시적 생성자 (Implicit Constructor)

 

성자를 명시적으로 만들지 않으면, 아무 인자도 받지 않는 기본 생성자 컴파일러에 의해 자동으로 만들어진다. 

 

그러나 우리가 명시적(Explicit)으로 아무 생성자 하나 만들면, 자동으로 만들어지던 기본 생성자는 더 이상 만들어지지 않는다.

 


 

 

소멸자 (Destructor)

 

생성된 객체가 범위를 벗어나면 객체는 소멸된다. 이 때 호출되는 특정한 멤버 함수가 소멸자이다.

소멸자는 프로그램을 종료하기 전에 자원을 반납하는데 유용하게 사용된다. ex. 파일 닫기, 메모리 반환 작업.

 

"

소멸자는 값을 반환하거나 매개 변수를 사용할 수 없다.

"

 


 

 

 

전체 코드

 

더보기
#include <iostream>
using namespace std;

class Knight
{
public:
    // [1] 기본 생성자 (인자가 없음)
    Knight()
    {
        cout << "Knight() 기본 생성자 호출" << endl;

        _hp = 100;
        _attack = 10;
        _posX = 0;
        _posY = 0;
    }

    // [2] 복사 생성자 : 자기 자신의 클래스 참조 타입을 인자로 받음.
    // 일반적으로 '똑같은' 데이터를 지닌 객체가 생성되길 기대한다
    Knight(const Knight& knight)
    {
        _hp = knight._hp;
        _attack = knight._attack;
        _posX = knight._posX;
        _posY = knight._posY;
    }

 // [3] 기타 생성자
    Knight(int hp)
    {
        cout << "Knight(int) 기본 생성자 호출" << endl;

        _hp = hp;
        _attack = 10;
        _posX = 0;
        _posY = 0;
    }

    // 소멸자
    ~Knight()
    {
        cout << "Knight() 소멸자 호출" << endl;
    }

    // 멤버 함수 선언
    void Move(int y, int x);
    void Attack();
    void Die()
    {
        _hp = 0;
        this->_hp = 1;  // this는 자기 자신을 가리킨다
        cout << "Die" << endl;
    }

public:
    // 멤버 변수
    int _hp;
    int _attack;
    int _posY;
    int _posX;
};


void Knight::Move(int y, int x)
{
    _posY = y;
    _posX = x;
    cout << "Move" << endl;
}

void Knight::Attack()
{
}

int main()
{
    Knight k1(100);
    // k1._hp = 100;
    k1._attack = 10;
    k1._posY = 0;
    k1._posX = 0;

    k1.Move(2, 2);
    k1.Attack();
    k1.Die();

    return 0;
}

 

실행화면


 

'⭐ Programming > C++' 카테고리의 다른 글

[C++] 상속성  (0) 2022.04.04
[C++] 생성자와 소멸자 2  (0) 2022.04.04
[C++] 객체지향  (0) 2022.04.03
[C++] 파일 분할 관리, #ifndef, #endif  (0) 2022.04.03
[C++] 문자열, strlen, strcpy, StrCat, StrCmp, ReverseStr  (0) 2022.03.30