본문 바로가기
C++ 공부

class 02

by Dev_Cat 2021. 8. 19.
728x90
반응형

Preview

  • class 01에서 class는 [구조체+함수]와 유사하했다.
  • 사실 여기에 부가적으로 알파가 추가되어야한다.
  • 알파에는 접근제어자+상속 등등이 있다.
  • class와 구조체(struct) 멤버에는 Data와 Function이 있다
  • class에서 Function을 Method라고 부른다

접근제어

  • class를 통해 Object를 구현가능 이때, 객체의 내부와 외부 기억
  • 외부에서 내부로 접근하는걸 통제하는게 필요 why? 문제방지
  • 만약 다 public처럼 사용가능하면 class의 기능을 잃는다

생성자 / 소멸자

  • C++ class는 [생성자/소멸자] 제공하며 이는 함수다.
  • [생성자/소멸자]는 호출시점 특정할수없음 -> 자동으로 호출
  • 호출시점은 문법에 의해 이미 정해짐 프로그래머가 개입해 수정X
  • [생성자/소멸자]는 반환이 없다

C++ 생성자 test 코드

class CTest
{
public:
  CTest() // 생성자
  {
    std::cout << "CTests()" << std::endl;
  }
};

CTest b;

int main(void)
{
  std::cout << "Begin of main()" << std::endl;
  CTest a;
  return 0;
}
  • tests코드 실행시 CTest b -> main -> CTest a 순서대로 호출됨
  • C에선 main()이 시작점이였다면 C++에선 그렇지 않음을 기억

C++ 소멸자 test 코드

class CTest
{
public:
  CTest()
  {
    std::cout << "CTests()" << std::endl;
  }
  ~CTest() // 소멸자
  {
    std::cout << "~CTests()" << std::endl;
  }
};

int main(void)
{
  std::cout << "Begin of main()" << std::endl;
  CTest a;
  std::cout << "End of main()" << std::endl;
  return 0;
} // scope가 닫히는 시점
  • test코드 실행시 Begin -> CTest -> End -> ~CTest 순으로 실행
  • main의 스코프가 닫히는 시점이 지역변수의 소멸시점이다
  • 이때 모든 소멸자가 call됨을 기억

new/delete

-C에 malloc/free, C++은 new/delete를 사용 둘은 비슷하나 다름

new/delete VS malloc/free

class CTest
{
public:
  CTest()
  {
    std::cout << "CTests()" << std::endl;
  }
  ~CTest()
  {
    std::cout << "~CTests()" << std::endl;
  }
};

int main(void)
{
  // 생성자 호출이 안됨
  CTest *pTest = (CTest*)malloc(sizeof(CTest));
  free(pTest);

  // 생성자 호출 됨
  CTest *pNewTest = new CTest;
  delete pNewTest;
  return 0;
}
  • 실행시 pTest는 생성자 호출이 안됨 왜냐 pTest가 가리키는건 CTest데이터가 들어갈수있는 메모리인건지 CTest가 아니기 때문
  • pNewTest는 생성자와 소멸자 호출 가능
  • new는 "그 인스턴스냐" malloc은 "그 인스턴스를 담을수 있을 정도에 충분한 메모리 크기냐" 를 의마하니 서로 다름을 기억
728x90
반응형

'C++ 공부' 카테고리의 다른 글

constructor 03  (0) 2021.08.20
constructor 02  (0) 2021.08.20
constructor 01  (0) 2021.08.20
class 03  (0) 2021.08.20
class 01  (0) 2021.08.19