コピーコンストラクターの引数がconstなのはなぜですか?
-
05-07-2019 - |
質問
Vector(const Vector& other) // Copy constructor
{
x = other.x;
y = other.y;
引数がconstである理由
解決
あなたは、俳優がコピーされているものを変更できないことを保証することに言及する答えを得ました-そして、彼らは正しいです、そこにconstを置くことはその効果を持っています。
しかし、より重要なのは、一時オブジェクトが非const参照にバインドできないことです。コピーアクターは、一時オブジェクトのコピーを作成できるようにconstオブジェクトへの参照を取得する必要があります。
他のヒント
constであるため、コピーctor内の引数 other
を変更しないためです。
x = other.x
を実行したとき、本質的には this-> x = other.x
を意味します。したがって、 other
変数から値をコピーするだけで、 this
オブジェクトのみを変更しています。 other
変数はここでは読み取り専用であるため、const-refとして渡されます。
従来のコピーアクターと友人は、上記で指定した理由により、 const&
パラメーターを使用します。ただし、 move-semanticsも参照する必要があります。 および r-value参照(すべてがうまくいけばC ++ 0xの一部になります) const&
パラメーターなしでcopy-ctorを使用する理由とタイミングを確認します。別の場所は、 auto_ptr
<などのスマートポインターの実装です。 / a>(所有権のセマンティクスの転送があります)非constパラメーターが便利です。
other
を(偶然に)変更できないようにするために
コピーコンストラクターを使用して1つのオブジェクトを別のオブジェクトにコピーしようとすると、元のオブジェクト(コピーしている)の元のコピーを維持する必要があるため、オブジェクトを渡す間、それを定数にし、参照として渡します。
コピーコンストラクターの考え方は、 other
オブジェクトの内容を this
オブジェクトにコピーするということです。 constは、 other
オブジェクトを変更しないようにするためにあります。
コピーコンストラクターに固有のものではありません。どの関数でも、オブジェクトの内部状態を変更しない場合、オブジェクトは const
として渡されます。
Vector(const Vector& other)
{
//Since other is const, only public data member and public methods which are `const` can be accessed.
}
たとえばconst参照のみを持つオブジェクトをコピーする場合にも便利です。
...
const Vector& getPosition();
...
Vector* v = new Vector(getPosition());
Vector(const Vector&amp; other)
でない場合、その例は構文エラーを作成します。