Adaid's Workroom

[C++] OOP in C++ (3) 본문

전공 공부/언어

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

어데이드 2018. 6. 23. 03:51

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

자료3

Copy constructor - 같은 타입의 객체로 초기화될 때 호출되는 생성자 

복사 생성자

- 매개변수가 객체인 생성자

- 명시적으로 복사 생성자를 만들지 않으면 컴파일러가 자동으로 만들어줌

구현 방법

- 멤버 이니셜라이저 이용

  (ex) Person(const Person& src) : height(src.height), ...

- 생성자 본문 이용

  (ex) Person(const Person& src) { height = src.height; ... }

- 대부분 복사 생성자를 직접 만들 필요는 없음

Copy assignment operator - 객체를 다른 객체에 대입할 때 호출되는 메서드

복사 대입 연산자

- 객체를 다른 객체에 대입할 때 호출

- =연산자를 각 클래스에서 오버로딩해서 구현

  (ex) Person& operator=(const Person& rhs);

- 명시적으로 만들지 않으면 컴파일러가 자동으로 만들어 줌

- 대입 연산이 중첩되어 수행될 수 있기 때문에 복사 생성자와 달리 Person의 참조 객체를 리턴

  (ex) p1 = p2 = p3

구현 방법

- vs. 복사 생성자

  복사 생성자는 객체 초기화 시점에만 호출되기 때문에 대상 객체 멤버들이 아직 유효하지 않음

  복사 대입 연산자는 이미 생성된 객체를 대상으로 하기 때문에 멤버들의 메모리 할당 여부에 

  신경쓰지 않고도 값을 덮어 쓸 수 있음

- C++에선느 객체가 자기 스스로를 대입하는 것이 문법적으로 가능

  구현 시 이 경우를 배제해서는 안 됨

  (ex) if(this == &rhs) { return *this };

Shallow / Deep copy - 최소의 것만 / 모든 것들을 복사

얕은 복사

- 포인터가 가리키는 데이터는 빼놓고 주소 값만 복사하는 방식

- 복사 생성자와 복사 할당 연산자의 경우 대부분 컴파일러가 직접 만들어 주지만

  int, double, 포인터 등 기본 데이터 타입은 그 대신 얕은 복사가 일어남

- 객체가 동적으로 할당받은 메모리를 가지고 있을 경우 문제가 됨

깊은 복사

- 포인터만 복사하지 않고 변수의 맥락에 맞게 연관된 데이터까지 재귀적으로 복사하는 방식

- 얕은 복사의 문제를 피하기 위해서는 대입대상인 좌변항의 객체가 참조하고 있는 메모리를

  반환한 후에 새로 메모리를 준비해 깊은 복사를 해야함

Rule of 0 / 3 - C++의 자원 관리 법칙

0의 법칙

- 소멸자, 복사 생성자, 복사 할당 연산자 모두를 명시적으로 만들지 않으면

  컴파일러가 모두 자동으로 만들어준다는 법칙

3의 법칙

- 소멸자, 복사 생성자, 복사 할당 연산자 모두를 중 하나를 명시적으로 만들었다면

  나머지 모두 명시적으로 만들어야한다는 법칙

'전공 공부 > 언어' 카테고리의 다른 글

[C++] OOP in C++ (4) (진행중)  (0) 2018.06.23
[C++] OOP in C++ (1)  (0) 2018.06.21
[C++] C에서 C++로  (0) 2018.06.21
[C++] Google C++ 코딩 스타일 정리(작성중)  (0) 2018.01.03
Comments