不変オブジェクトにコピーコンストラクタが不要なのはなぜですか?これを説明してください。
4 に答える
値は変更できないため、すべての場合に同じオブジェクトを参照するのは良いことです。いわば「余分なコピー」を用意する必要はありません。
これは、特に生涯に関して、言語に依存する質問です。しばらくの間、それらを忘れましょう。
コピーコンストラクターは、1つのオブジェクトを取得して、その完全に独立したコピーを作成できるという点で価値があります。これは、最初のオブジェクトから独立して2番目のオブジェクトを変更できるという点で価値があります。または、コンポーネントがプライベートコピーを作成して、オブジェクトをその下から変更する他のコンポーネントから自身を保護することもできます。
不変オブジェクトは変更できません。変更されないオブジェクトのコピーを作成することに価値はありません。
さて、もう一度生涯について話しましょう。C ++のような言語では、コピーコンストラクターを使用して、メモリ/ライフタイムの問題を回避することもできます。たとえば、を使用するAPIを作成していSomeType*
て、メソッドの存続期間よりも長く保持したい場合です。C ++では、これを行う最も信頼できる方法は、コピーコンストラクターを介してオブジェクトのコピーを作成することです。
これは言語に多少依存します:
ただし、多くの言語ではコピーコンストラクタが必要です。提供しない場合、言語は暗黙的に生成します。
ただし、不変オブジェクトの場合、デフォルトのコピーコンストラクターが(通常)すべての値の浅いコピーを実行するため、これは通常は問題ありません。可変データ型(つまり、他のオブジェクトへの内部オブジェクト参照を含む)では、コピーはその中にカプセル化された参照/ポインターのみをコピーするため、通常、浅いコピーは適切な選択ではありません。
不変オブジェクトの値は変更できないため、これは非常に自然なことです。