[C++] OOP in C++ (2)
내용 출처 - 옥찬호님 자료 요약
Constructor - 객체 생성시 호출되는 메서드
생성자
- 객체가 선언될 때 실행되는 코드
- 클래스와 같은 이름의 함수이고, 인수나 리턴 값이 없는 상태로 선언
- 생성자는 public (예외: 싱글턴 패턴)
호출 시기
- 객체를 만들 때: Person p;
- 메모리를 할당할 때: Person *p = new Person;
오버로드
- 생성자 오버로드 조건은 함수 오버로드 조건과 동일
생성자를 만들지 않으면
- 디폴트 생성자 만들어짐
- 디폴트 생성자는 인수를 가지지 않지만 멤버가 초기화됨
(단, int 나 char 등 기본 타입은 초기화되지 않음)
클래스 멤버 초기화
- 클래스의 각 멤버는 생성자로 초기화되어야 함
- 생성자가 시작하는 곳에서 멤버 변수가 선언됨
(멤버 변수가 클래스 객체이면 생성자 호출)
- 어떤 경우 문제가 될 수 있음
* const 멤버 변수: 선언할 때 초기화 되어야 함
* 레퍼런스 멤버 변수: 어떤 변수 참조할 것인지 지정해야 함
- 이 때는 디폴트 생성자를 실행하지 않고 클래스 멤버의 생성자로 인수를 전달해야 함
: 멤버 이니셜라이저(Member Initializer)
(ex) Person::Person(...) : height(_height), weight(_weight)
Destructor - 객체 파괴시 호출되는 매서드
소멸자
- 객체가 더 이상 필요 없을 때 호출됨
- 생성자 앞에 틸트(~) 문자를 붙여 선언
호출 시기
- delete로 삭제될 때
- 영역 밖으로 넘어갈 때
- 다른 소멸자에 의해 파괴될 때
(ex) class Person { string name, ssn;}
name과 ssn의 소멸자는 Person 소멸자가 실행을 마친 뒤 호출
클래스에 소멸자를 추가하지 않더라도 클래스 객체에 대해 소멸자 실행해줌
생성 순서와 소멸 순서
- 먼저 선언한 객체가 먼저 생성, 나중에 소멸
this pointer - 멤버 함수가 호출된 객체의 주소값
this 포인터
- 현재 멤버 함수가 호출된 인스턴스의 메모리 주소를 가리킴
멤버 변수들과 멤버 함수들을 연결
- 멤버 변수들은 각각의 인스턴스에서 저장할 내용이 다르기 때문에 반드시 별도로 존재해야 되지만
멤버 함수들은 인스턴스가 늘어나도 바뀔 필요가 없음
- 프로세스 구조상 멤버 변수들이 보관되는 영역(스택, 힙, 데이터)과
멤버 함수들이 존재하는 영역(코드)은 나누어져 있음
- 코드 영역은 실행 중 변경을 막기 위해 보호되어 런타임 중 변경 X
- this 포인터를 통해 멤버 함수가 인스턴스를 구별
- 멤버 함수를 호출하게 되면 호출한 인스턴스의 포인터를 같이 보내 이를 가지고 멤버 변수에 접근
- 멤버 함수 내에서 명칭 우선운위: 지역 변수 > 멤버 변수 > 전역 변수