생성자와 소멸자
객체가 생기고 사라질 때는 무슨 일이 일어날까?
생성자
생기자마자 칸을 채웁니다
생성자(constructor)는 인스턴스의 데이터 멤버에 첫 값을 넣는 함수입니다. 이름은 클래스 이름과 같고, 인스턴스가 생길 때 저절로 불립니다. Stack의 생성자는 힙(실행 중에 받아 쓰는 칸, 4강)에 정수 100개의 배열을 받아 둡니다.
new는 힙에서 칸을 받는 명령입니다. 생성자는 객체를 만들지는 않고 초기화만 합니다.
연산의 속
push가 표현을 지킵니다
push는 먼저 자리가 남았는지 봅니다. 남았으면 topPtr을 1 늘리고 그 칸에 값을 넣습니다. 가득 찼으면 오류를 알리고 넣지 않습니다. 표현을 바꾸는 길이 연산뿐이니 이 검사를 건너뛸 수 없습니다.
++topPtr은 topPtr을 먼저 1 늘린다는 뜻이고, cerr << 는 오류 글을 내보내는 코드입니다. 5는 예시 값입니다.
소멸자
떠날 때 칸을 돌려줍니다
소멸자(destructor)는 인스턴스가 사라질 때 뒷정리를 하는 함수입니다. 주로 힙에서 받은 칸을 돌려줍니다. 이름은 클래스 이름 앞에 ~를 붙인 것이고, 객체의 수명이 끝날 때 저절로 불립니다.
delete는 힙의 칸을 돌려주는 명령입니다. 수명은 변수가 메모리 칸을 차지하고 있는 기간입니다.
언제 생기고 사라지나
사는 기간은 세 가지
C++의 인스턴스는 세 가지 방식으로 만들 수 있고, 방식마다 사는 기간이 다릅니다. 정적이면 프로그램 내내, 스택 동적이면 선언이 실행될 때부터 블록을 벗어날 때까지, 힙 동적이면 new에서 delete까지입니다.
스택 영역은 메모리의 구역 이름으로, 우리가 만든 Stack 타입과는 다른 것입니다. 블록은 중괄호로 둘러싼 구역입니다.
명세와 구현의 분리
선언과 정의를 나눕니다
C++에서는 클래스를 두 파일로 나눠 적을 수 있습니다. 헤더 파일에는 멤버 함수의 이름과 타입만, 구현 파일에는 본문을 적습니다. 사용하는 쪽은 헤더만 봅니다.
void push(int); 처럼 본문 없는 선언이 프로토타입입니다. Stack::push는 Stack 클래스의 push라는 뜻입니다.
다음 편