Metaverse/복습

C++ - 복사 생성자

onenewkong 2024. 1. 3. 00:16

: 한 객체가 다른 객체로 복사될 때 호출되는 특별한 멤버 함수

class MyClass {
public:
    // 복사 생성자
    MyClass(const MyClass& other) {
        // 복사 수행
        // ...
    }
    
    // 다른 멤버 함수들과 변수들
};
  • 객체의 복사 생성자는 해당 객체와 동일한 자료형의 다른 객체를 받아들여서, 원본 객체의 내용을 새로 생성된 객체에 복사함
  • 여기서 const MyClass& other는 복사 생성자의 매개변수로 전달되는 객체를 상수 참조로 받음을 나타냄
  • 복사생성자가 호출될 때 복사될 객체를 변경하지 않고 읽기만 한다는 것을 의미

 

복사 생성자가 호출되는 상황

  • 객체의 복사가 필요한 경우: 객체를 다른 객체로 복사하려고 할 때
    • 함수에 인자로 전달
    • 객체 반환
MyClass obj1;
MyClass obj2 = obj1;  // 복사 생성자 호출
  • 객체의 임시 복사: 임시 객체가 생성되어 반환되는 경우
MyClass createObject() {
    MyClass tempObj;
    return tempObj;  // 복사 생성자 호출
}

 

복사 생성자는 기본적으로 컴파일러에 의해 자동으로 생성되지만, 클래스가 동적으로 할당된 자원을 소유하거나 복사 생성자의 동작을 사용자 정의해야 하는 경우, 사용자가 직접 복사 생성자를 구현할 수 있음

 

깊은 복사와 얕은 복사

얕은 복사

  • 단순히 객체의 멤버 변수들을 복사하는 것을 의미
  • 만약 객체가 동적으로 할당된 메모리를 포인터로 가지고 있다면, 얕은 복사는 그 포인터만을 복사하게 됨, 이는 두 객체가 같은 메모리를 공유하게 되는 결과를 가져옴
  • 얕은 복사는 빠르게 이루어지지만, 두 객체 간의 독립성이 부족하며 하나의 객체가 자원을 변경하면 다른 객체도 영향을 받을 수 있음
class ShallowCopyExample {
public:
    int *data;

    // 얕은 복사 생성자
    ShallowCopyExample(const ShallowCopyExample& other) : data(other.data) {}
};

 

깊은 복사

  • 객체의 멤버 변수뿐만 아니라 그 멤버 변수가 가리키는 모든 자원까지 복사하는 것을 의미
  • 동적으로 할당된 메모리가 있는 경우, 깊은 복사는 새로운 메모리를 할당하고 그 값을 복사하여 두 객체가 완전히 독립적으로 되도록 함
  • 깊은 복사는 복사하는데 시간이 더 걸릴 수 있으며 메모리 소모가 더 많을 수 있음
class DeepCopyExample {
public:
    int *data;

    // 깊은 복사 생성자
    DeepCopyExample(const DeepCopyExample& other) : data(new int(*(other.data))) {}

    // 소멸자에서 동적으로 할당된 메모리 해제
    ~DeepCopyExample() {
        delete data;
    }
};

'Metaverse > 복습' 카테고리의 다른 글

STL - sort  (0) 2024.01.18
STL - max_element와 min_element  (0) 2024.01.18
C++ - 범위 기반 for문  (1) 2024.01.03
C++ - 생성자와 소멸자  (0) 2023.12.27
운영체제 - Call Stack  (0) 2023.12.27