>백엔드 개발 >C++ >C에서 기존 개체에 할당할 때 복사 생성자가 호출되지 않는 이유는 무엇입니까?

C에서 기존 개체에 할당할 때 복사 생성자가 호출되지 않는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-08 09:22:11572검색

Why Isn't the Copy Constructor Called When Assigning to an Existing Object in C  ?

기존 개체에 새 값을 할당할 때 복사 생성자가 우회되는 이유

제공된 코드 조각에서 개체 a는 다음으로 초기화됩니다. 값은 5입니다. 표준 A 생성자가 예상대로 호출됩니다. 그러나 가정과 달리 새로 생성된 객체를 할당할 때 복사 생성자는 호출되지 않습니다.

이 동작은 컴파일러 최적화의 결과도 아니고 언어 사양의 누락도 아닙니다. 이는 C 표준(§12.8.15, 페이지 211)에 명시적으로 문서화되어 있습니다. 표준에서는 다음 할당이 의미상 동일하다는 것이 "완전히 허용 가능"하다고 명시합니다.

T = x;
T(x);

논리적으로 T(T(x))와 같은 중복 할당은 코드 최적화에서 제거될 수 있습니다. . 따라서 컴파일러는 자동으로 기본 생성자를 호출하여 a를 초기화한 다음 새로 생성된 객체를 직접 할당합니다.

복사 생성자를 강제로 호출하려면 할당하기 전에 명시적으로 기본 생성 a를 생성해야 합니다.

A a; // Default-construct 'a'

// Copy constructor will be called to
// copy data from the newly constructed object.
a = A(5);

위 내용은 C에서 기존 개체에 할당할 때 복사 생성자가 호출되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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