> 백엔드 개발 > C++ > 기본 복사 생성자는 선언된 복사 생성자가 없는 개체가 있는 클래스를 어떻게 처리합니까?

기본 복사 생성자는 선언된 복사 생성자가 없는 개체가 있는 클래스를 어떻게 처리합니까?

Barbara Streisand
풀어 주다: 2024-11-12 12:15:02
원래의
564명이 탐색했습니다.

How Does the Default Copy Constructor Handle Classes with Objects Lacking Declared Copy Constructors?

다른 객체를 포함하는 클래스의 기본 복사 생성자

C에서 클래스를 선언할 때 명시적인 구현이 제공되지 않으면 컴파일러는 자동으로 기본 복사 생성자를 제공할 수 있습니다. 그러나 선언된 복사 생성자가 없는 객체가 포함된 클래스를 처리할 때 이 생성자의 동작은 더욱 복잡해집니다.

다음 코드를 고려하세요.

class Foo {
  Bar bar;
};

class Bar {
  int i;
  Baz baz;
};

class Baz {
  int j;
};

Foo f1;
Foo f2(f1);
로그인 후 복사

무슨 문제가 발생할까요? 이 시나리오에서 기본 복사 생성자가 작동합니까?

컴파일러 생성 복사 생성자 동작

Foo에 대한 컴파일러 생성 복사 생성자는 다음과 같이 작동합니다.

  1. 기본 클래스(있는 경우)의 복사 생성자를 호출합니다.
  2. Foo의 각 멤버 변수를 복사합니다. 여기에는 Bar에 대한 복사 생성자를 호출하는 작업이 포함됩니다.
  3. Bar의 복사 생성자는 Baz에 대한 복사 생성자를 호출합니다.

따라서 제공된 예에서 f1을 사용하여 f2를 생성할 때 , 컴파일러는 다음을 수행합니다.

  1. f2에 대해 Foo의 복사 생성자를 호출합니다.
  2. Foo의 복사 생성자는 bar의 복사 생성자를 호출합니다.
  3. 복사 bar의 생성자는 baz의 복사 생성자를 호출합니다.

Baz에는 선언된 복사 생성자가 없으므로 컴파일러는 이에 대한 기본 복사 생성자를 생성합니다. 이 기본 복사 생성자는 j 값을 복사하지만 j 값이 가리키는 객체는 복사하지 않고 얕은 복사를 수행합니다.

얕은 복사와 깊은 복사

이 얕은 복사 동작은 다음을 의미한다는 점에 유의하는 것이 중요합니다. Foo의 멤버 변수가 가리키는 객체는 복사되지 않습니다. 원본 객체가 나중에 수정되면 수정된 값이 복사된 객체에 반영되지 않으므로 의도하지 않은 결과가 발생할 수 있습니다.

복사 프로세스를 더 자세히 제어하려면 복사 생성자를 명시적으로 정의하는 것이 좋습니다. 멤버 변수의 제어된 복사가 필요한 클래스.

위 내용은 기본 복사 생성자는 선언된 복사 생성자가 없는 개체가 있는 클래스를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿