C에서 클래스를 선언할 때 명시적인 구현이 제공되지 않으면 컴파일러는 자동으로 기본 복사 생성자를 제공할 수 있습니다. 그러나 선언된 복사 생성자가 없는 객체가 포함된 클래스를 처리할 때 이 생성자의 동작은 더욱 복잡해집니다.
다음 코드를 고려하세요.
class Foo { Bar bar; }; class Bar { int i; Baz baz; }; class Baz { int j; }; Foo f1; Foo f2(f1);
무슨 문제가 발생할까요? 이 시나리오에서 기본 복사 생성자가 작동합니까?
Foo에 대한 컴파일러 생성 복사 생성자는 다음과 같이 작동합니다.
따라서 제공된 예에서 f1을 사용하여 f2를 생성할 때 , 컴파일러는 다음을 수행합니다.
Baz에는 선언된 복사 생성자가 없으므로 컴파일러는 이에 대한 기본 복사 생성자를 생성합니다. 이 기본 복사 생성자는 j 값을 복사하지만 j 값이 가리키는 객체는 복사하지 않고 얕은 복사를 수행합니다.
이 얕은 복사 동작은 다음을 의미한다는 점에 유의하는 것이 중요합니다. Foo의 멤버 변수가 가리키는 객체는 복사되지 않습니다. 원본 객체가 나중에 수정되면 수정된 값이 복사된 객체에 반영되지 않으므로 의도하지 않은 결과가 발생할 수 있습니다.
복사 프로세스를 더 자세히 제어하려면 복사 생성자를 명시적으로 정의하는 것이 좋습니다. 멤버 변수의 제어된 복사가 필요한 클래스.
위 내용은 기본 복사 생성자는 선언된 복사 생성자가 없는 개체가 있는 클래스를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!