C++ 개념 정리

6. 생성자, 소멸자

CE : 하랑 2026. 1. 3. 00:44

- 생성자

객체가 생성될 때 자동으로 호출되는 클래스 멤버 함수입니다. 이 함수는 객체의 초기화를 담당합니다.

 

초기화 방법 3가지

(1) 리터럴 초기화

class UMonster 
{
    // 맴버
private:

    // 최신 C++의 방식인 리터럴 초기화
    int32 iHp = 20;
};

 

(2) 리스트 이니셜라이즈 초기화 방식 

-> 맴버 변수가 다 public 일 때만 가능

class UPlayer
{
public:
    // public인 변수는 배열초기화를 하것처럼 초기화 할수 있는데.
    // 이걸 이니셜라이즈 리스트 초기화 방식이라고 한다.
    // 모든 변수가 public일때만 가능하다.
    // UPlayer NewPlayer = { 10 };
    int32 iHp = 30;
};

int main()
{
    UPlayer NewPlayer = { 10 };

	...
}

 

(3) 맴버이니셜 라이저 문법 생성자

class NPC
{
public:
    // 생성자
    // 맴버함수의 규칙에서 예외
    // 1. 리턴값이 없다. => 자기 자신을 포함하고 있는 객체를 만들어서 리턴
    // 2. 생성자는 애는 객체 없이도 호출 가능 -> 무순을 해결해야하는데 그방법으로 생성자는 객체 없이도 호출하게 만든 것뿐
    // 3. 무조건 클래스의 이름과 동일해야 한다. -> 사용편의성을 위한 규칙
    // 4. 초기화를 위한 맴버이니셜라이저 문법이라는 것을 유일하게 사용할 수 있다.
    // -> 아래 내용확인
    // 5. 디폴트 생성자를 만들지 않았다면, 
    // 아래와 같은 기본 생성자를 만들어 버린다
    
    // 대입과 초기화의 차이를 이해
    // int value=0; -> 메모리가 만들어짐과 동시에 값을 넣어준느 초기화
    // value=0 -> 메모리가 만들어진 이후에 값을 넣어주는 대입
    // 맴버이니셜 라이저 문법 생성자() : 맴버이름()
    NPC() : iHp(100), iAtt(10) // int32()
    {
      // 사용할수 있다. -> 이미 만들어져 있다.
      // 대입
      iHp=20;
    }

private:
    int32 iHp;
    int32 iAtt;
};

 

 

- 소멸자

소멸자는 객체가 소멸될 때 자동으로 실행되는 클래스의 멤버 함수

 

- vitual 소멸자 이유?

부모

class A
{
public:
     // 부모 클래스 소멸자에서 virtual 해두면 자식도 실행
    virtual ~A()
    {
        int32 ia = 0;
    };
   
    virtual void test()
    {
        std::cout << "부모" << "\n";
        int32 ia = 0;
    }

private:
    
};

 

자식

class B :public A
{

public:
    ~B()
    {
        int32 ia = 0;
    }
    
    void test()
    {
        std::cout << "자식"<<"\n";
        int32 ia = 30;
    }

private:
    std::vector<int32> i_List = { 10,10 };
};

 

A* test = new B();

 

생성자 인 경우 

부모(A) -> 자식 (B) 순으로 실행 virtual 유무 노상관

 

소멸자인 경우

부모 소멸자에서 virtual을 안하면 부모 소멸자만 호출되고 자식 소멸자는 호출이 안돼 릭이 남는다.

virtual을 함으로써 자식 소멸자도 실행한다.

자식 실행 후 -> 부모 실행 생성자와 반대

 

예시) begine, tick 부모 함수 호출  먼저 실행

참고

- 클래스에 virtual 함수가 여러 개면 생성될 때 생성자에서 자동으로 함수 포인터의 배열로 만들고, 그 배열의 포인터를 들고 있기 때문이다. void(**vfptr)()가 된다. 그래서 virtual 함수가 여러 개여도 클래스의 크기는 8바이트가 된다. 그리고 그 함수 포인터의 배열이 가상함수 테이블

- 가상함수 테이블이란 함수 포인터의 배열의 첫번째 주소이다.

- 함수 2중 포인터라고 할 수 있다.

- 생성자에서 가상함수 테이블의 값들을 채워준다.

 

'C++ 개념 정리' 카테고리의 다른 글

8. Enum Vs Enum Class  (0) 2026.01.04
7. C++ 형변환  (1) 2026.01.03
5. 연산자  (0) 2026.01.03
4. 메모리  (0) 2026.01.01
3. C++ template  (0) 2025.12.30