ムーブコンストラクタとムーブ代入演算子について

上記がわかりやすい。

まず、用語の整理。

・コピー:複製
・ムーブ:移動

当たり前といえば、当たり前なんだけど、これをイメージしながら考えると頭に入りやすい。
※厳密にいうと、ムーブの挙動が「最適化されたコピー」というケースもあるが、イメージは上記でいい。

C++11以前にあった、コピーコンストラクタとコピー代入演算子はコピーを実現するものだった。
これのムーブ版が、ムーブコンストラクタとムーブ代入演算子。

コピーコンストラクタの定義と使用方法

class X{
  X(const X &obj)  // コピーコンストラクタ
  {
    // 実装は省略
  }
}

int main(){
  X a;
  X b = a; // bのコピーコンストラクタが呼ばれる。
}

ムーブコンストラクタの定義と使用方法

class X{
  X(X &&obj)  // ムーブコンストラクタ
  {
    // 実装は省略
  }
}

int main(){
  X a;
  X b = std::move(a); // bのムーブコンストラクタが呼ばれる。
}

オーバーロードコピー代入演算子の定義と使用方法

class X{
  X& operator=(const X&)  // オーバーロードコピー代入演算子
  {
    // 実装は省略
  }
}

int main(){
  X a;
  X b;
  b = a; // bのオーバーロードコピー代入演算子が呼ばれる。
}

オーバーロードムーブ代入演算子の定義と使用方法

class X{
  X& operator=(X&&)  // オーバーロードムーブ代入演算子
  {
    // 実装は省略
  }
}

int main(){
  X a;
  a = X(); // aのオーバーロードムーブ代入演算子が呼ばれる。
}

参考:何々の時に〇〇コンストラクタが呼出しされるが覚えられないので特訓
参考:プログラミング言語C++ 第4版 位置No.18174

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です