C & C++ FAQ
|
|
ムーブコンストラクタとは、既存オブジェクトの内部表現を移動して、新規のオブジェクトを作るためのコンストラクタです。以下に示す例で考えましょう。
class Array {
int* ptr; // 配列(の先頭要素)へのポインタ
int sz; // 要素数
public:
// コピーコンストラクタ
Array::Array(const Array& a) : ptr{new int[a.sz]}, sz{a.sz} {
for (int i = 0; i != sz; ++i)
ptr[i] = a.ptr[i];
}
// ムーブコンストラクタ
Array(Array&& a) : ptr{a.ptr}, sz{a.sz} {
a.elem = nullptr; // どこも指さない
a.sz = 0;
}
};
コピーコンストラクタは、引数aと同じ内部表現をもつオブジェクトを構築するためのものであるのに対し、ムーブコンストラクタは、引数aの内容を安全に盗むとともにaをスッカラカンにしてしまうコンストラクタです。
ムーブコンストラクタを利用すれば、一時変数の構築の際に同一内容のオブジェクトが無駄に生成されるのを抑制できます。
なお、ムーブコンストラクタの引数に指定されている&&は、値を束縛するための右値参照(rvalue reference)です。また、aの値を変更する必要があるため、コピーコンストラクタとは違い、constを付けることはできません。
■ 根拠 ■
標準C++ 3rd
| §12.8
| Copying and moveint class objects
|