オブジェクト指向プログラミングでは、変換コンストラクターと演算子は、ある型から別の型へのオブジェクトの変換を容易にします。ただし、実行可能な変換パスが複数存在し、どれが優先されるかという問題が生じるシナリオが発生する可能性があります。
指定されたコード スニペットでは、A オブジェクトを B 変数 (B) に割り当てるときに、変換演算子が呼び出されます。 b = A();)、変換演算子と変換コンストラクターの両方が存在するにもかかわらず。次のセクションでは、この動作の背後にある理論的根拠とその哲学的意味について詳しく説明します。
C 標準では、セクション 13.3.1.4 であいまいな変換呼び出しを解決するための優先順位を確立しています。 「最適な」ユーザー定義変換を選択するためにオーバーロード解決が使用されると述べています。この場合、候補関数には B の変換コンストラクターと A の変換演算子の両方が含まれます。
ソースと宛先の型が異なるクラス (S と T) の場合、コンパイラーは型 T のオブジェクトを初期化します (コピーの初期化経由)、一連の変換ステップを適用することによって。この標準では、S とその基本クラスの両方の変換関数が考慮されています。追加の cv 修飾子なしで T に一致する型、または T から派生した型を生成する変換関数が候補になります。このステップにより、この場合、演算子 B() と B(const A&) の両方が候補として選択されます。
その後、C 標準はオーバーロード解決を適用して、引数に最も一致するものを決定します。引数リストは、このインスタンスの初期化子式で構成されます。私たちのコードでは、引数は左辺値である A オブジェクトです。
優先順位を決定する重要な要素はセクション 13.3.3.2/3 にカプセル化されています。「2 つの候補関数が両方とも参照バインディングであり、参照バインディングである場合」互換性のある型では、参照の cv 修飾が最も少ないものが優先されます。"
私たちのコードでは、演算子 B() はメンバー関数であるため、型 A の左辺値を受け取りますが、B(const A&) は const 参照を受け取ります。演算子 B() は const 修飾の数が少ないため、コンパイラーによって上位の候補として選択され、変換演算子が呼び出されます。
哲学的解釈より観点からすると、変換がどのように行われるかについて A と B のどちらがより多くの知識を持っているかという選択には議論の余地があります。
한편으로는 B(대상 유형)가 A 객체로부터 자신을 구성하는 방법을 정의할 책임이 있기 때문에 더 지식이 풍부한 당사자라고 주장할 수 있습니다. B의 변환 생성자는 특정 변환 규칙이나 유효성 검사를 캡슐화할 수 있습니다.
반면에 A(소스 유형)가 자체 표현과 B로 해석될 수 있는 방법에 대해 더 큰 통찰력을 갖고 있다고 주장할 수도 있습니다. 물체. A의 변환 연산자를 사용하면 객체가 B로 변환되는 방법을 제어할 수 있습니다.
궁극적으로 C 표준은 변환 연산자가 우선순위를 갖는 접근 방식을 선택하여 소스 객체의 표현에 우선순위를 부여합니다. 이 선택은 객체 자체가 자신의 내부 상태와 다른 유형으로 변환될 수 있는 방법을 가장 잘 이해하고 있다는 개념과 일치합니다. 그러나 이 우선순위 규칙은 과부하 해결 규칙의 적용을 받으며, 최종 결정은 예제 코드에서 볼 수 있듯이 const-qualification과 같은 다른 요소의 영향을 받을 수 있다는 점에 유의해야 합니다.
위 내용은 객체를 한 유형에서 다른 유형으로 변환할 때 변환 연산자가 변환 생성자보다 우선하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!