班级类包含一个构造方法,传入一个包含许多学生的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
。
网友评论