본문 바로가기
공부/C, C++

[C/C++] Class (2) - 생성자, 소멸자

by 김샤랑 2022. 3. 22.

[C/C++] Class (2) - 생성자, 소멸자


목차

1. struct 사용의 변화

2. 접근 제한자 (private, protected, public)

3. private vs public

4. class란

5. class 초기화 문법

6. 멤버 함수

7. 레퍼런스 변수


구조체 초기화 : 기존에는 초기화 함수(InitArr)를 구현해서, 호출하여 구조체를 초기화해줬다.

객체 초기화: 객체가 만들어지면서 바로 초기화가 되어야 한다.

 

그래서 생성자에서 이니셜 라이저라는 초기화 문법을 제공한다.


5. class 초기화 문법

- 생성자

콜론(:)을 사용한다.

코드 중간부분부터라고 가정

public:
	//생성자
    //이니셜라이저
    CMy()
    	: m_i(100)   // : 하고 초기화 할것을 적는다.
        , m_f(0.f)  // 콤마(,)로 이어간다.
    {
    }
};

 


그리고 링크드 리스트를 배울 때 맨 마지막에 free를 위한 함수도 있었다. 

그럼 C++에서는 어떻게 해주는 게 있지 않을까?

객체를 생성하면 자동으로 초기화해주는 게 있으니, 그렇다면 소멸자도 있지 않을까? 

 

- 소멸자

물결 표시(~) 하고 클래스 이름을 적어주면 소멸자가 된다.

이 객체가 소멸할 때 호출한다.

코드 중간부분부터라고 가정

public:
	//생성자
    //이니셜라이저
    CMy()
    	: m_i(100)   // : 하고 초기화 할것을 적는다.
        , m_f(0.f)  // 콤마(,)로 이어간다.
    {
    }
    
    //소멸자
    ~CMy()
    {
    }
};

 

지금 이 두 기능만으로도 많은 것이 편리해진 것을 알 수 있다...ㅎㅎ

 

즉, 

  • 객체 생성, 소멸 시 자동으로 호출된다.
  • 생성자와 소멸자는 C++문법상 반드시 존재해야 하는 게 규칙이기 때문에 직접 만들지 않으면, 자동으로 생긴다.(기본 생성자, 기본 소멸자)
  • 물론 자동으로 만들어지면 기능은 없지만 컴파일 과정에서 만들어진다.

이렇게 요약할 수 있다!!


6. 멤버 함수

  • 멤버 함수란 해당 클래스가 사용하는 전용 함수라고 할 수 있다.
  • 함수를 호출하기 위해서는 해당 클래스를 실체화 한 객체가 필요하다.
  • 멤버 함수를 객체를 통해서 호출하면, 해당 객체의 주소가 this 포인터로 전달된다.

 

클래스는 자료형이고, 만들어진 애들을 객체라고 한다.

int는 자료형이고 int a는 객체인 것과 같다. 

 

멤버 함수라는 것은 어차피 클래스 전용 함수이기에 굳이 누구의 객체의 함수라고 말을 안 해도 된다.

멤버 함수는 this로 객체의 주소를 전달받는다.

컴파일러 단계에서 설계되어 있어서 기본적으로 this를 생략해서 사용한다. (m_i = i;)

 

매번 이 함수가 호출하는 객체를 알 필요가 없다!!

this가 대응하는 객체 주소를 호출해주니 함수를 재활용하기 쉽다.

 

(앗 스크린샷 에서 18줄 소문자 cMy는 오타이다. CMy가 맞다!)


- 편리해졌다!

 

이전 링크드 리스트. c 포스팅에서 main 부분이다.

여기서는 함수를 불러 쓸 때 어떤 객체를 쓸 것인지 &list로 넣어줬지만,

이제는 아래처럼 객체 전용 멤버 함수를 써서 수고로움이 감소했다.

 

CMy c1;
c1.SetInt(10);

CMy c2;
c2.SetInt(100); 

 

 

 

댓글