こんにちは。
本日はコピーコンストラクタとムーブコンストラクタについて学習しましたのでまとめていこうと思います。
特殊メンバ関数とは
今回まとめたコピーコンストラクタとムーブコンストラクタは、いわゆる特殊メンバ関数と呼ばれるグループの一部です。
特殊メンバ関数には他にも、デフォルトコンストラクタやコピー代入演算子などがあります。
(今回はコピーコンストラクタとムーブコンストラクタのみ、言及しようと思います。)
ムーブコンストラクタとは
ムーブコンストラクタとは他オブジェクトが所有するリソースの所有権を、新しいオブジェクトへ移すコンストラクタのことです。
要は、データの受け渡し時に、オーバーヘッドを減らすことができるコンストラクタというわけです。
例文は下記のようになります。
ClassBox a; //中身を持つaというオブジェクトを作成
ClassBox b = std::move(a); //aからbに中身を移動させる
この時、aの中身は存在しているが中身については保証されない状態になり、bのみ中身が保証されるため注意が必要です。
ゲームで例えを挙げるのなら、
ロード済みの膨大なステージデータの所有権を別オブジェクトに渡す。
というイメージがわかりやすいかもしれません。
コピーコンストラクタとは
続いて、コピーコンストラクタについてです。
こちらは既存のオブジェクトと同じ状態を持つ新しいオブジェクトを作成するコンストラクタになります。
先ほど同様にゲームで例えるのなら、
セーブデータ1をセーブデータ2に任意のタイミングでコピーできるようなシステムが欲しい
と言ったような状況です。
私が勘違いしたこと。
さて、自分はこのコピーコンストラクタを調べるにあたり、
「わざわざ同じ状態の複製体を作成するのなら、継承で十分ではないか。」
と考えていました。
しかし、実際には継承はクラスを拡張する仕組みであり、既存オブジェクトの現在の状態を複製することはできませんでした。
例えを挙げてみましょう。
ゲーム中にHPが100から10へ減少したプレイヤーを複製したいとします。
新しくPlayerオブジェクトを生成しただけでは、コンストラクタによって初期状態(HP100)のオブジェクトが作られてしまいます。
一方、コピーコンストラクタでは現在のオブジェクト情報を丸々コピーするため、
HP10の状態を維持した新しいオブジェクトを生成できます。
つまり、コピーコンストラクタは初期状態のオブジェクトを作成するのではなく、
「現在の状態を持った新しいオブジェクトを作る」という仕組みなのです。
以上
本記事は、業務や学習を通して理解した内容を、自分自身の整理も兼ねてまとめたものです。内容に改善点や補足などがありましたら、ご指摘いただけますと幸いです。