제가 대학교 1학년 때 [명품 C++ Programming] 교재로 진행되는 C++ 수업에서 배운 내용을 교재와 ppt를 중심으로 정리한 내용입니다.
(2022.9 ~ 2022.12)
당시에 공부를 위해서 HWP 파일로 정리해 놓은 것을 그대로 올립니다.
🍑복사 생성자
얕은 복사와 깊은 복사
- 두 복사 모두 객체 복사 시 객체의 멤버를 1:1로 복사
얕은 복사
- 객체의 멤버 변수에 동적 메모리가 할당된 경우 사본은 원본 객체가 할당받은 메모리를 공유하는 문제가 발생
깊은 복사
- 객체의 멤버 변수에 동적 메모리가 할당된 경우 사본은 원본이 가진 메모리 크기 만큼 별도로 동적 할당
- 완전한 형태의 복사이므로 사본과 원본이 메모리를 공유하는 문제가 발생X
복사 생성 및 복사 생성자
- 복사 생성 : 객체가 생성될 때 원본 객체를 복사하여 생성되는 경우
- 복사 생성자 : 객체의 복사 생성시 호출되는 특별한 생성자
복사 생성자의 특징
- 매개변수는 오직 하나이며, 자기 클래스에 대한 참조로 선언
- 클래스에 오직 한 개만 선언 가능
- 보통생성자와 클래스 내에 중복 선언 가능
- 클래스에 대한 참조 매개 변수를 가지는 독특한 생성자의 모양
복사 생성자의 선언
→ 클래스명(const 클래스명& 매개변수이름);
복사 생성자의 실행
→ 클래스명 객체이름(기존객체이름);
디폴트 복사 생성자
: 복사 생성자가 선언되어 있지 않는 클래스의 경우 컴파일러는 자동으로 디폴트 복사 생성자를 삽입하고 이 생성자를 호출하도록 컴파일
- 얕은 복사를 실행하도록 만들어진 코드
- 원본 객체의 모든 멤버를 일대일로 사본에 복사하도록 구성
얕은 복사 생성자의 문제점
- 포인터 타입의 멤버 변수가 없는 클래스 → 문제X
- 포인터 타입의 멤버 변수가 있는 클래스 → 공유의 문제발생
(원본 객체의 포인터 멤버 변수와 사본 객체의 포인터 멤버 변수가 같은 메모리를 가르키게됨)
묵시적 복사 생성
1. 객체로 초기화하여 객체가 생성될 때
클래스명 객체이름 = 객체이름;
클래스명 객체이름(객체이름);
클래스 객체이름;
객체이름 = 객체이름; 의 경우 치환문임
2. 값에 의한 호출로 객체가 전달될 때
3. 함수가 객체를 리턴할 때
- 리턴 객체의 복사본을 생성하여 호출한곳으로 전달