Когда использовать конструкторы/назначения перемещения

Я искал, но не нашел ответа на вопрос «Когда» их использовать. Я просто продолжаю слышать, что это хорошо, потому что это экономит мне лишнюю копию. Я поместил его в каждый класс, который у меня был, но почему-то казалось, что это не имеет смысла для некоторых классов: S Я прочитал бесчисленное количество руководств по LValues ​​и RValues ​​и std::move vs. std::copy vs. memcpy против memmove и т. д. И даже читал о throw(), но я не уверен, когда его использовать.

Мой код выглядит следующим образом:

struct Point
{
    int X, Y;

    Point();
    Point(int x, int y);
    ~Point();

    //All my other operators here..
};

Затем у меня есть массив классов примерно такого типа (что-то вроде RAII):

class PA
{
    private:
        std::vector<Point> PointsList;

    public:
        PA();
        //Variadic Template constructor here..
        ~PA();
        //Operators here..
 };

Должен ли я использовать конструктор перемещения и конструктор копирования? У меня он был в классе Point, но он показался мне странным, поэтому я его удалил. Затем он был у меня в классе PA, но я подумал, что он ничего особенного не даст, поэтому я его тоже удалил. Затем в моем классе растровых изображений мой компилятор жаловался на наличие членов-указателей, но не на перегрузку, поэтому я сделал:

//Copy Con:
BMPS::BMPS(const BMPS& Bmp) : Bytes(((Bmp.width * Bmp.height) != 0) ? new RGB[Bmp.width * Bmp.height] : nullptr), width(Bmp.width), height(Bmp.height), size(Bmp.size), DC(0), Image(0)
{
    std::copy(Bmp.Bytes, Bmp.Bytes + (width * height), Bytes);
    BMInfo = Bmp.BMInfo;
    bFHeader = Bmp.bFHeader;
}

//Move Con:
BMPS::BMPS(BMPS&& Bmp) : Bytes(nullptr), width(Bmp.width), height(Bmp.height), size(Bmp.size), DC(0), Image(0)
{
    Bmp.Swap(*this);
    Bmp.Bytes = nullptr;
}

//Assignment:
BMPS& BMPS::operator = (BMPS Bmp)
{
    Bmp.Swap(*this);
    return *this;
}

//Not sure if I need Copy Assignment?

//Move Assignment:
BMPS& BMPS::operator = (BMPS&& Bmp)
{
    this->Swap(Bmp);
    return *this;
}

//Swap function (Member vs. Non-member?)
void BMPS::Swap(BMPS& Bmp) //throw()
{
    //I was told I should put using std::swap instead here.. for some ADL thing.
    //But I always learned that using is bad in headers.
    std::swap(Bytes, Bmp.Bytes);
    std::swap(BMInfo, Bmp.BMInfo);
    std::swap(width, Bmp.width);
    std::swap(height, Bmp.height);
    std::swap(size, Bmp.size);
    std::swap(bFHeader, Bmp.bFHeader);
}

Это правильно? Я сделал что-то плохое или неправильное? Мне нужно бросить ()? Должны ли мои операторы присваивания и перемещения присваивания быть такими же? Нужно ли мне копирование задания? Ах, так много вопросов :c Последний форум, на котором я спрашивал, не мог ответить на все, поэтому я был сбит с толку. Наконец, я должен использовать unique_ptr для байтов? (Это массив байтов/пикселей.)

6
задан ildjarn 18 June 2012 в 17:23
поделиться