クラス Y の新しいオブジェクトを作成する次の 2 つの方法を見てください。
(1)
X x;
Y y(x);//explicit conversion
(2)
X x;
Y y = x;//implicit conversion
最初の方法は明示的な変換を使用し、別の方法は暗黙的な変換を使用します。しかし、私はそれらがどのように機能するかをよく理解していません.それらの違いは何ですか?誰かが私のために解釈できますか?詳細なほど良い.どうもありがとう.
1 つ目は直接初期化と呼ばれ、2 つ目はコピー初期化と呼ばれます。(またはそれへY
の参照) を取るコンストラクターがあると仮定すると、コンストラクターがimplicitとしてマークされているかどうかに関係なく、直接開始はそのコンストラクターを直接呼び出します。コピー初期化は、意味的には次と同等です。X
Y y( implicit_conversion<Y>(x) );
つまり、引数は暗黙的な変換によって変換先の型に変換され、コピー コンストラクターが呼び出されて変数が初期化されます。実際には、コンパイラはコピーを削除し、宛先変数の代わりに変換しますが、コンパイラはからへの暗黙的な変換があること、およびコピー コンストラクタにアクセスできることを確認する必要があります。X
Y
実際、クラス「Y」に次のようなコンストラクターがあると仮定すると、どちらも暗黙的な変換です。
public:
Y(X &x)
単一の引数を持つクラス コンストラクターが変換を実行します。
暗黙的な構築を避けるには、次のいずれかを使用します (状況によっては、どちらかが適している場合があります)。
explicit
コンストラクター宣言でキーワードを使用する