>백엔드 개발 >C++ >전체 복사와 얕은 복사: 언제 내 데이터의 실제 복사본이 필요합니까?

전체 복사와 얕은 복사: 언제 내 데이터의 실제 복사본이 필요합니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-27 11:01:30914검색

 Deep Copy vs. Shallow Copy: When Do I Need a True Copy of My Data?

깊은 복사와 얕은 복사

질문:

두 복사 사이의 주요 차이점은 무엇인가요? 전체 복사와 얕은 복사?

답변:

얕은 복사:

  • 객체의 값을 복사하지만 유지합니다. 공유 객체에 대한 참조.
  • 예:

    <code class="c++">class X {
    private:
      int i;
      int *pi;
    public:
      X() : pi(new int) {}
      X(const X& copy) : i(copy.i), pi(copy.pi) {}
    };</code>

    이 얕은 복사본에서 pi는 원본 객체와 복사된 객체 모두에서 동일한 int 객체를 참조합니다.

전체 복사:

  • 포함된 모든 개체를 포함하여 원본 개체의 전체 복사본을 만듭니다.
  • 예:

    <code class="c++">class X {
    private:
      int i;
      int *pi;
    public:
      X() : pi(new int) {}
      X(const X& copy) : i(copy.i), pi(new int(*copy.pi)) {}
    };</code>

    이 깊은 복사에서 pi는 원본과 동일한 값을 가진 새로운 int 개체를 가리킵니다.

복사 생성자 유형:

기본 복사 생성자는 각 멤버의 복사 생성자의 동작에 따라 다릅니다.

  • 스칼라 유형의 경우 기본 할당 연산자가 사용되므로 얕은 복사본이 생성됩니다.
  • 그러나 기본 복사 생성자가 항상 얕은 복사를 수행한다고 말하는 것은 엄밀히 말하면 정확하지 않습니다. 구성원 유형의 복사 동작에 따라 전체 복사를 구현하거나 깊은 복사와 얕은 복사의 조합을 구현할 수도 있습니다.

예:

In 다음 예에서 기본 복사 생성자는 구현으로 인해 std::Vector 멤버에 대한 전체 복사본을 생성합니다.

<code class="c++">class Y {
private:
    std::vector<int> v;
public:
    Y() {}
    Y(const Y& copy) : v(copy.v) {}
};</code>

이 경우 std::Vector의 복사 생성자는 해당 멤버의 전체 복사본을 생성합니다. 내용입니다.

위 내용은 전체 복사와 얕은 복사: 언제 내 데이터의 실제 복사본이 필요합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.