コピー コンストラクターの引数がポインターではなく参照であるのはなぜですか?
代わりにポインターを使用できないのはなぜですか?
コピー コンストラクターの引数がポインターではなく参照であるのはなぜですか?
代わりにポインターを使用できないのはなぜですか?
多くの理由があります:
参照を NULL にすることはできません。OK、NULL 参照を作成することは可能ですが、 astd::vector<int>*
を aにキャストすることも可能std::vector<SomeType>*
です。これは、そのようなキャストが定義済みの動作を持っているという意味ではありません。また、NULL 参照を作成することもありません。ポインターは、NULL に設定された場合の動作を定義しています。参照はしません。したがって、参照は常に実際のオブジェクトを参照することが期待されます。
変数と一時変数は、それらの型へのポインターに暗黙的に変換することはできません。明らかな理由で。実行中の一時変数へのポインターは必要ありません。これが、標準が明示的にそれを禁止している理由です (少なくともコンパイラーが実行していることを伝えることができる場合)。しかし、それらを参照することは許可されています。これらは暗黙的に作成されます。
ポイント 2 のため、参照ではなくポインターを使用すると、すべてのコピー操作でアドレス取得演算子(&)を使用する必要があります。ちょっと待って、C++ 委員会はばかげてそれをオーバーロードすることを許可しました。std::addressof
したがって、アドレスを取得するには、C++11 の機能であるを実際に使用する必要があります。したがって、すべてのコピーは次のようにする必要があります。または、単に参照Type t{std::addressof(v)};
を使用することもできます。
ただの命名法です。ポインターも使用できますが、それは変換コンストラクターと呼ばれます。
考えてみれば、あるオブジェクトを別のオブジェクトにコピーする (つまり「コピー」) ため、これは理にかなっています。オブジェクトへのポインターからではありません。ポインターの場合、ポインターをオブジェクトにコピーするのではなく、ポインターが指しているオブジェクトをオブジェクトにコピーするため、コピーは行われません。
ポインターはnullptr
チェックする必要がある可能性があり、一時的にそれらへのポインターを持つことはできないためです。
参照渡しにより、実際のオブジェクトがコピー コンストラクターに確実に渡されますが、ポインターは NULL 値を持つことができ、コンストラクターが失敗します。