카테고리 없음

[C++] OOP in C++ (2)

어데이드 2018. 6. 22. 04:41

내용 출처 - 옥찬호님 자료 요약

자료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 포인터를 통해 멤버 함수가 인스턴스를 구별

- 멤버 함수를 호출하게 되면 호출한 인스턴스의 포인터를 같이 보내 이를 가지고 멤버 변수에 접근

- 멤버 함수 내에서 명칭 우선운위: 지역 변수 > 멤버 변수 > 전역 변수