std::move

2021-02-01  本文已影响0人  陈成_Adam

班级类包含一个构造方法,传入一个包含许多学生的vector:

class Banji {
public:
  Banji(std::vector<Xuesheng> students) : m_students(students) {}
private:
  std::vector<Xuesheng> m_students;
}

这样有个不好的地方是:每次创建班级对象时都需要将students拷贝给m_students。一个推荐的做法是使用std::move避免拷贝:

class Banji {
public:
  Banji(std::vector<Xuesheng> students) : m_students(std::move(students)) {}
private:
  std::vector<Xuesheng> m_students;
}

但如果students是引用的时候,就需要特别小心了,因为std::move(students)会将students里面的内容清空。下面举例说明:

class Banji0 {
public:
  Banji0(std::vector<Xuesheng> students) : m_students(std::move(students)) {}
private:
  std::vector<Xuesheng> m_students;
}

class Banji1 {
public:
  Banji1(std::vector<Xuesheng> &students) : m_students(std::move(students)) {}
private:
  std::vector<Xuesheng> m_students;
}

int main() {
  auto students = std::vector<Xuesheng>{Xuesheng{0}, Xuesheng{1}};
  auto class0 = Banji0{students};
  std::cout << students.size() << std::endl;

  auto class1 = Banji1{students};
  std::cout << students.size() << std::endl;
  return EXIT_SUCCESS;
}

输出为:

2
0

创建第一个班级对象时,students作为形参会被拷贝一份,所以经过std::move之后,其大小仍然为2;创建第二个班级对象时,传入的是students的引用,所以经过std::move之后,其大小变为0

上一篇 下一篇

猜你喜欢

热点阅读