Programming | 프로그래밍 언어/C++

복사 생성자

gyunnnnnn 2022. 11. 13. 18:27

복사 생성자란?

  • 멤버 대 멤버 복사를 실행한다.
  • 복사 생성자를 정의하지 않으면 멤버 대 멤버의 복사를 진행하는 디폴트 복사 생성자가 자동으로 삽입된다.
class Point
{
private:
    int x;
    int y;
public:
    Point(int x, int y) : x(x), y(y) { } // 디폴트 생성자
    Point(const Point &copy) : x(copy.x), y(copy.y){ } // 디폴트 복사 생성자
};

깊은 복사와 얕은 복사

얕은 복사

  • 멤버변수의 멤버 대 멤버 복사만 실행한다.
    Person man1("Kang", 29);
    Person man2 = man1;

깊은 복사

  • 메모리 공간 할당 후 문자열 복사
  • 할당된 메모리의 주소 값을 멤버에 저장한다.
    Person(const Person& copy) : age(copy.age)
    {
      name = new char[strlen(copy.name)+1];
      strcpy(name, copy.name);
    }
  1. 멤버변수 age의 멤버 대 멤버 복사
  2. 메모리 공간 할당 후 문자열 복사, 그리고 할당된 메모리의 주소 값을 멤버 name에 저장

복사 생성자의 호출시점

1. 기존에 생성된 객체를 이용해 새로운 객체를 초기화하는 경우

  • 가장 일반적인 경우이다.
Person man1("Kang", 27);
Person man2 = man1; // 복사 생성자 호출

2. Call-by-value 방식의 함수호출 과정에서 객체를 인자로 전달하는 경우

SoSimple sim1(SoSimple ob) {}
SoSimple sim2;
sim1(sim2); // SoSimple sim1 = sim2;로 복사 생성자가 호출된다.

3. 객체를 반환하되, 참조형으로 반환하지 않는 경우

  • 반환하는 순간 SoSimple객체를 위한 메모리 공간 할당 후 임시객체의 복사 생성자가 호출된다.
SoSimple func(SoSimple ob)
{
    return ob;
}

복사 생성자 호출 시점 정리

  • 객체를 새로 생성해야 한다. 생성과 동시에 동일한 자료형의 객체로 초기화해야 한다.
  • 임시객체는 다음 행으로 넘어가면 바로 소멸되어 버린다.
  • 참조자에 참조되는 임시객체는 바로 소멸되지 않는다.