1

クラス Y の新しいオブジェクトを作成する次の 2 つの方法を見てください。

(1)

X x;
Y y(x);//explicit conversion

(2)

X x;
Y y = x;//implicit conversion

最初の方法は明示的な変換を使用し、別の方法は暗黙的な変換を使用します。しかし、私はそれらがどのように機能するかをよく理解していません.それらの違いは何ですか?誰かが私のために解釈できますか?詳細なほど良い.どうもありがとう.

4

2 に答える 2

1

1 つ目は直接初期化と呼ばれ、2 つ目はコピー初期化と呼ばれます。(またはそれへYの参照) を取るコンストラクターがあると仮定すると、コンストラクターがimplicitとしてマークされているかどうかに関係なく、直接開始はそのコンストラクターを直接呼び出します。コピー初期化は、意味的には次と同等です。X

Y y( implicit_conversion<Y>(x) );

つまり、引数は暗黙的な変換によって変換先の型に変換され、コピー コンストラクターが呼び出されて変数が初期化されます。実際には、コンパイラはコピーを削除し、宛先変数の代わりに変換しますが、コンパイラはからへの暗黙的な変換があること、およびコピー コンストラクタにアクセスできることを確認する必要があります。XY

于 2012-04-04T02:42:32.290 に答える
0

実際、クラス「Y」に次のようなコンストラクターがあると仮定すると、どちらも暗黙的な変換です。

public:
  Y(X &x)

単一の引数を持つクラス コンストラクターが変換を実行します。

暗黙的な構築を避けるには、次のいずれかを使用します (状況によっては、どちらかが適している場合があります)。

  • 単一の引数でコンストラクターを宣言しないでください
  • explicitコンストラクター宣言でキーワードを使用する
  • 中間クラスを使用します (つまり、'Y' に直接割り当てられないクラスである 'Z' によってのみ 'Y' を初期化できるようにします)。
  • 静的メンバー関数を使用して、「X」を使用して「Y」のインスタンスを明示的に「作成」します (メンバー関数はクラスのインスタンスに関連付けられていないため)
于 2012-04-04T02:14:09.663 に答える