객체 지향 프로그래밍에서 변환 생성자와 연산자는 객체를 한 유형에서 다른 유형으로 쉽게 변환합니다. 그러나 여러 개의 실행 가능한 변환 경로가 존재하는 시나리오가 발생할 수 있으며 어느 것이 우선하는지에 대한 질문이 제기됩니다.
주어진 코드 조각에서 A 객체를 B 변수에 할당할 때 변환 연산자가 호출됩니다(B b = A();), 변환 연산자와 변환 생성자가 모두 있음에도 불구하고. 다음 섹션에서는 이 동작의 근거와 철학적 의미를 자세히 살펴봅니다.
C 표준은 섹션 13.3.1.4에서 모호한 변환 호출을 해결하기 위한 우선 순위를 설정합니다. "최상의" 사용자 정의 변환을 선택하기 위해 과부하 해결이 사용된다고 명시합니다. 이 경우 후보 함수에는 B의 변환 생성자와 A의 변환 연산자가 모두 포함됩니다.
소스 유형과 대상 유형이 다른 클래스(S 및 T)인 경우 컴파일러는 T 유형의 객체를 초기화합니다( 복사 초기화를 통해) 일련의 변환 단계를 적용합니다. 표준은 S의 변환 기능과 기본 클래스를 모두 고려합니다. 추가 cv 한정자 없이 T에서 일치하거나 파생된 유형을 생성하는 변환 함수가 후보가 됩니다. 이 단계를 통해 우리의 경우 연산자 B()와 B(const A&)가 모두 후보로 선택됩니다.
이후 C 표준은 인수에 가장 적합한 항목을 결정하기 위해 오버로드 확인을 적용합니다. 인수 목록은 이 인스턴스의 이니셜라이저 표현식으로 구성됩니다. 우리 코드에서 인수는 lvalue인 A 객체입니다.
우선순위를 결정하는 중요한 요소는 섹션 13.3.3.2/3에 요약되어 있습니다. "두 후보 함수가 모두 참조 바인딩이고 다음을 참조하는 경우 호환 가능한 유형, 참조에서 cv 자격이 가장 적은 유형이 선호됩니다."
우리 코드에서 연산자 B()는 장점으로 유형 A의 lvalue를 취합니다. B(const A&)는 const 참조를 사용하는 반면 멤버 함수입니다. 연산자 B()는 const 자격이 적기 때문에 컴파일러에 의해 우수한 후보로 선택되어 변환 연산자가 호출됩니다.
철학에서 관점에서 볼 때 A와 B 중 어느 쪽이 전환이 발생해야 하는지에 대해 더 많은 지식을 갖고 있는지 선택하는 데는 논쟁의 여지가 있습니다.
한편으로는 B(대상 유형)가 A 객체로부터 자신을 구성하는 방법을 정의할 책임이 있기 때문에 더 지식이 풍부한 당사자라고 주장할 수 있습니다. B의 변환 생성자는 특정 변환 규칙이나 유효성 검사를 캡슐화할 수 있습니다.
반면에 A(소스 유형)가 자체 표현과 B로 해석될 수 있는 방법에 대해 더 큰 통찰력을 갖고 있다고 주장할 수도 있습니다. 물체. A의 변환 연산자를 사용하면 객체가 B로 변환되는 방법을 제어할 수 있습니다.
궁극적으로 C 표준은 변환 연산자가 우선순위를 갖는 접근 방식을 선택하여 소스 객체의 표현에 우선순위를 부여합니다. 이 선택은 객체 자체가 자신의 내부 상태와 다른 유형으로 변환될 수 있는 방법을 가장 잘 이해하고 있다는 개념과 일치합니다. 그러나 이 우선순위 규칙은 과부하 해결 규칙의 적용을 받으며, 최종 결정은 예제 코드에서 볼 수 있듯이 const-qualification과 같은 다른 요소의 영향을 받을 수 있다는 점에 유의해야 합니다.
위 내용은 객체를 한 유형에서 다른 유형으로 변환할 때 변환 연산자가 변환 생성자보다 우선하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!