Написал для вас этот шаблон с поддержкой перемещения. Изучите его, и вы получите его.
/// <summary>Container.</summary>
class Container {
private:
// Here be data!
std::vector<unsigned char> _Bytes;
public:
/// <summary>Default constructor.</summary>
Container(){
}
/// <summary>Copy constructor.</summary>
Container(const Container& Copy){
*this = Copy;
}
/// <summary>Copy assignment</summary>
Container& operator = (const Container& Copy){
// Avoid self assignment
if(&Copy == this){
return *this;
}
// Get copying
_Bytes = Copy._Bytes; // Copies _Bytes
return *this;
}
/// <summary>Move constructor</summary>
Container(Container&& Move){
// You must do this to pass to move assignment
*this = std::move(Move); // <- Important
}
/// <summary>Move assignment</summary>
Container& operator = (Container&& Move){
// Avoid self assignment
if(&Move == this){
return *this;
}
// Get moving
std::swap(_Bytes, Move._Bytes); // Moves _Bytes
return *this;
}
}; // class Container
Я всегда против использования аргументов значения, подобных этому:
function(std:vector<item2> items)
Я всегда использую либо:
function(const std:vector<item2>& items)
function(std:vector<item2>& items)
function(std:vector<item2>&& items)
, особенно для больших контейнеров данных, и редко:
function(std:vector<item2> items)
для небольших данных, но не векторов.
Таким образом, вы контролируете, что происходит, и поэтому мы делаем C ++, чтобы контролировать все.
- Если вам нужна копируемая копия, просто скопируйте ссылку на const самостоятельно в переменную.
- Если вам нужна только для чтения, ссылка на const предотвращает создание новой копии.
- Если вы хотите редактировать оригинал, просто используйте ссылку.
- И используйте аргументы значения длянебольшие данные, когда вам лень.
Очевидно, все зависит от того, что вы делаете.
Я - самоучка, разработчик C ++.Далеко не эксперт, особенно в сленге C ++ ... но учится :) 1032 *