Я просматриваю Знакомство с C ++ (Раздел 5.2 Копирование и перемещение). Следуя инструкциям в книге, я построил контейнер под названием Vector
(он имитирует std::vector
). Моя цель - эффективно реализовать следующее (поэлементное) суммирование:
Vector r = x + y + z;
Согласно книге, если у меня нет присваивания перемещения и конструктора, оператор +
в конечном итоге скопирует Vector
s без надобности. Итак, я реализовал назначение перемещения и конструктор, но я думаю, что компилятор все еще не использует их, когда я запускаю Vector r = x + y + z;
. Что мне не хватает? Я ценю любую обратную связь. Ниже мой код. Я ожидаю увидеть результат Move assignment
, но ничего не получаю. (Суммирующая часть работает, это просто переезд, в котором я не уверен)
Код
// Vector.h
class Vector{
public:
explicit Vector(int);
Vector(std::initializer_list<double>);
// copy constructor
Vector(const Vector&);
// copy assignment
Vector& operator=(const Vector&);
// move constructor
Vector(Vector&&);
// move assignment
Vector& operator=(Vector&&);
~Vector(){delete[] elem;}
double& operator[](int) const;
int size() const;
void show();
friend std::ostream& operator<< (std::ostream& out, const Vector& vec);
private:
int sz;
double* elem;
};
Vector operator+(const Vector&,const Vector&);
// Vector.cpp
Vector::Vector(std::initializer_list<double> nums) {
sz = nums.size();
elem = new double[sz];
std::initializer_list<double>::iterator it;
int i = 0;
for (it=nums.begin(); it!=nums.end(); ++it){
elem[i] = *it;
++i;
}
}
Vector::Vector(Vector&& vec) {
sz = vec.sz;
vec.sz = 0;
elem = vec.elem;
vec.elem = nullptr;
std::cout<<"Move constructor"<<std::endl;
}
Vector& Vector::operator=(Vector&& vec) {
if (this == &vec){
return *this;
}
sz = vec.sz;
vec.sz = 0;
elem = vec.elem;
vec.elem = nullptr;
std::cout<<"Move assignment"<<std::endl;
return *this;
Vector operator+(const Vector& vec1, const Vector& vec2){
if (vec1.size() != vec2.size()){
throw std::length_error("Input vectors should be of the same size");
}
Vector result(vec1.size());
for (int i=0; i!=vec1.size(); ++i){
result[i] = vec1[i]+vec2[i];
}
return result;
}
}
// Main
int main() {
Vector x{1,1,1,1,1};
Vector y{2,2,2,2,2};
Vector z{3,3,3,3,3};
Vector r = x + y + z;
} // Here I expect the output: Move assignment, but I get no output.