新しいC ++ 11の動きといえば、あなたは左と右の値について言わなければなりません。
たとえば、int a = 1; int b = a;
私たちが言うb=a
、それは名前を持っているので、あなたはまた、次のようにアクセスすることができ、左の値であり;
そしてint a = 1; int b = a + c;
ここでもa+c
右の値であり、それはそう、それがアクセスすることはできません一時的な変数、名前のない、です。
モバイルコンストラクタ(移動コンストラクタ)
#include <cstring>
#include <algorithm>
class string
{
char* data;
public:
string(const char* p)
{
size_t size = std::strlen(p) + 1;
data = new char[size];
std::memcpy(data, p, size);
}
~string()
{
delete[] data;
}
string(const string& that)
{
size_t size = std::strlen(that.data) + 1;
data = new char[size];
std::memcpy(data, that.data, size);
}
日常コピーコンストラクタ(コピーコンストラクタ)の上に、我々はデータが11にコピーされ、その、新しいヒープメモリ空間を開くディープコピーです。
左の値は、コピーコンストラクタが必要です。たとえばstring a(x);
、ので、我々は訪問し続けることx
など、正しい値、のためstring b(x+y);
かstring c(some_function_returning_a_string());
、x+y
そしてsome_function_returning_a_string()
この一時的な変数は、文が出て破壊される次回は、なぜいないことの利点を取ることの後にアクセスすることはできませんか?右の値のために、私たちは直接、データの深い山をコピーしませんが、データの直接コピーは、この一時的な変数をポインタので。次の
string(string&& that) // string&& is an rvalue reference to a string
{
data = that.data;
that.data = nullptr;
}
それはコピーされませんので、その移動構造(移動コンストラクタ)と呼ばれます。