[명품 C++ Programming] chapter 5 : 함수와 참조, 복사 생성자(3) - 복사 생성자

eunee22·2023년 8월 20일

명품 C++ Programming

목록 보기
21/34

제가 대학교 1학년 때 [명품 C++ Programming] 교재로 진행되는 C++ 수업에서 배운 내용을 교재와 ppt를 중심으로 정리한 내용입니다.
(2022.9 ~ 2022.12)
당시에 공부를 위해서 HWP 파일로 정리해 놓은 것을 그대로 올립니다.

🍑복사 생성자

얕은 복사와 깊은 복사

  • 두 복사 모두 객체 복사 시 객체의 멤버를 1:1로 복사

얕은 복사

  • 객체의 멤버 변수에 동적 메모리가 할당된 경우 사본은 원본 객체가 할당받은 메모리를 공유하는 문제가 발생

깊은 복사

  • 객체의 멤버 변수에 동적 메모리가 할당된 경우 사본은 원본이 가진 메모리 크기 만큼 별도로 동적 할당
  • 완전한 형태의 복사이므로 사본과 원본이 메모리를 공유하는 문제가 발생X

복사 생성 및 복사 생성자

  • 복사 생성 : 객체가 생성될 때 원본 객체를 복사하여 생성되는 경우
  • 복사 생성자 : 객체의 복사 생성시 호출되는 특별한 생성자

복사 생성자의 특징

  • 매개변수는 오직 하나이며, 자기 클래스에 대한 참조로 선언
  • 클래스에 오직 한 개만 선언 가능
  • 보통생성자와 클래스 내에 중복 선언 가능
  • 클래스에 대한 참조 매개 변수를 가지는 독특한 생성자의 모양

복사 생성자의 선언

클래스명(const 클래스명& 매개변수이름);

복사 생성자의 실행

클래스명 객체이름(기존객체이름);

  • 기존 객체를 복사한 객체를 생성

디폴트 복사 생성자

: 복사 생성자가 선언되어 있지 않는 클래스의 경우 컴파일러는 자동으로 디폴트 복사 생성자를 삽입하고 이 생성자를 호출하도록 컴파일

  • 얕은 복사를 실행하도록 만들어진 코드
  • 원본 객체의 모든 멤버를 일대일로 사본에 복사하도록 구성

얕은 복사 생성자의 문제점

  • 포인터 타입의 멤버 변수가 없는 클래스 → 문제X
  • 포인터 타입의 멤버 변수가 있는 클래스 → 공유의 문제발생
    (원본 객체의 포인터 멤버 변수와 사본 객체의 포인터 멤버 변수가 같은 메모리를 가르키게됨)

묵시적 복사 생성

1. 객체로 초기화하여 객체가 생성될 때

  • 클래스명 객체이름 = 객체이름;
  • 클래스명 객체이름(객체이름);
  • 클래스 객체이름;
  • 객체이름 = 객체이름; 의 경우 치환문임

2. 값에 의한 호출로 객체가 전달될 때

3. 함수가 객체를 리턴할 때

  • 리턴 객체의 복사본을 생성하여 호출한곳으로 전달
profile
보안 공부하는 대학교 4학년 / 시리즈에서 더욱 편하게 글을 찾아보실 수 있습니다:)

0개의 댓글